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

时间:2015-12-15 13:35:54

标签: c# json

我有这个字符串

"{\"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中访问它?

2 个答案:

答案 0 :(得分:2)

目前,您正在使用返回DeserializeObject的非泛型object,因此编译时错误。一种可能性是将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; }
}

修改

您可以使用JObject

重复foreach
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 });

答案 1 :(得分:1)

@ Yuval的另一个替代方案是使用dynamic

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"
}