在c#中从JSON结构中提取数据



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,所以它不支持按对象键索引器(例如stringone)。您需要剥离foreach:

JToken jToken = obj["return"];
string output1_param = jToken["output01"].ToString();
string output2_param = jToken["output02"].ToString();

或与itemValues一起工作,例如通过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元素。

最新更新