我有这个字符串
"{\"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中访问它?
答案 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"
}