访问JSON字符串中的无效成员名称

本文关键字:成员 无效 JSON 字符串 访问 | 更新日期: 2023-09-27 18:26:55

我有这个字符串

"{'"0'":'"test'"}"

我在用JSON.net。我试过

var j = JsonConvert.DeserializeObject(input_string)
var t = j["0"]; //This causes a compile error
var k = j.Keys

我也许可以更改我的输入字符串,但我宁愿保持这种方式。如何在json.net中访问它?

访问JSON字符串中的无效成员名称

当前,您使用的是返回object的非泛型DeserializeObject,因此出现编译时错误。一种可能性是将json解析为JObject:

void Main()
{
    var json = "{'"0'":'"test'"}";
    var jobject = JObject.Parse(json);
    Console.WriteLine(jobject["0"]);
}

另一种方法是创建一个类,并使用适当的JsonProperty属性对其进行注释:

void Main()
{
    var json = "{'"0'":'"test'"}";
    var obj = JsonConvert.DeserializeObject<X>(json);
    Console.WriteLine(obj.Foo);
}
public class X
{
    [JsonProperty("0")]
    public string Foo { get; set; }
}

编辑

您可以使用foreach:迭代JObject

foreach (var element in jobject)
{
    Console.WriteLine($"Key: {element.Key}, Value: {element.Value }");
}

或者使用LINQ:

var enumerable = jobject.AsJEnumerable()
                        .Cast<JProperty>()
                        .Select(x => new { Key = x.Name, Value = x.Value });

@Yuval答案的另一个替代方案是使用动态:

dynamic j = JsonConvert.DeserializeObject(input_string);
string t = j["0"];
Console.WriteLine(t); //Prints out "test"

如果您想迭代所有键/值:

foreach(JProperty prop in j) {
    Console.WriteLine(prop.Name); // Prints out "0";
    Console.WriteLine(prop.Value); // Prints out "test"
}

如果不能使用动态

然后您可以使用JSON反序列化程序返回给您的JObject

JObject j = (JObject) JsonConvert.DeserializeObject(input_string);
string t = j.GetValue("0").Value<string>();
Console.WriteLine(t); // Prints out "test"

它可以迭代为:

foreach(var prop in j) {
    Console.WriteLine(prop.Key); // Prints out "0"
    Console.WriteLine(prop.Value.Value<string>()); // Prints out "test"
}