访问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中访问它?
当前,您使用的是返回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"
}