JSON data:
{
"return": {
"output01": "Test request success!!",
"output02": "test request"
}
}
c#代码:
JObject obj = JObject.Parse(jsonString);
JToken jToken = obj["return"];
foreach (JToken item in jToken)
{
string output1_param = item["output01"].ToString();
string output2_param = item["output02"].ToString();
}
想一个重复的例子。
系统。InvalidOperationException: '不能访问子值。Newtonsoft.Json.Linq.JProperty。">
怎么了?
item
是一个JProperty
,所以它不支持按对象键索引器(例如string
one)。您需要剥离foreach
:
JToken jToken = obj["return"];
string output1_param = jToken["output01"].ToString();
string output2_param = jToken["output02"].ToString();
或与item
的Values
一起工作,例如通过First
:
foreach (JToken item in jToken)
{
Console.WriteLine(item.First.ToString());
}
同样在这种情况下,在foreach
中转换为JProperty
也是一个选项:
foreach (JProperty item in jToken)
{
Console.WriteLine($"{item.Name} - {item.Value}");
}
正如你在这个链接中看到的,JToken的索引器没有实现,你的代码试图使用JToken的索引器。
当你调用jToken的GetEnumerator时,在这个例子中你只会得到一个JProperty元素,所以调用实现了jToken的JProperty的indexer(通过使用string key)会尝试使用这个indexer并抛出异常。
如果你这样调用会发生什么?
jToken["output01"].ToString();
在此模式中,您使用的是JObject的索引器,它遍历JObject的ChildrenTokens并给出值。
就像Guru说的,你必须使用value字段读取value,或者使用First元素。