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

C# 访问JSON字符串中的无效成员名称,c#,json,C#,Json,我有这根绳子 "{\"0\":\"test\"}" 我正在使用。我试过了 var j = JsonConvert.DeserializeObject(input_string) var t = j["0"]; //This causes a compile error var k = j.Keys 我也许可以更改输入字符串,但我宁愿保持这种方式。如何在json.net中访问它?目前,您使用的是非通用的反序列化对象,它返回一个对象,因此出现编译时错误。一种可能是将json解析为JObject:

我有这根绳子

"{\"0\":\"test\"}"
我正在使用。我试过了

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

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

目前,您使用的是非通用的
反序列化对象
,它返回一个
对象
,因此出现编译时错误。一种可能是将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; }
}
或使用LINQ:

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

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


如果要迭代所有键/值:

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"
JObject j=(JObject)JsonConvert.DeserializeObject(输入字符串);
字符串t=j.GetValue(“0”).Value();
控制台。写入线(t);//打印“测试”
它可以像这样迭代:

foreach(var prop in j) {
    Console.WriteLine(prop.Key); // Prints out "0"
    Console.WriteLine(prop.Value.Value<string>()); // Prints out "test"
}
foreach(j中的var prop){
Console.WriteLine(prop.Key);//打印出“0”
Console.WriteLine(prop.Value.Value());//打印出“test”
}

如果我不知道钥匙怎么办?我看到
j.Count
工作,但
j[0]
抛出异常。我似乎不知道如何获取每个密钥您的问题基本上是“如何从
JObject
”获取所有密钥?@acidzombie24查看我的编辑。迭代
JObject
将为您提供可以使用的键值对。我更愿意在这里使用linq,但这很好。我想出来了。非常琐碎。只需使用
IDictionary
而不是var@acidzombie24再次查看我的编辑:)您也可以使用LINQ。
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"
}