从 C# 中的 JSON 结构中提取数据

Extracting data from JSON structure in C#

JSON数据:

{
    "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();
}

想想重复的案例。

System.InvalidOperationException: 'Cannot access child value on Newtonsoft.Json.Linq.JProperty.'

怎么了?

item 是一个 JProperty,因此它不会 support 按对象键索引(例如 string 一个)。你需要 strip 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}");
}

如您在 This Link 中所见,JToken 的索引器未实现,您的代码尝试使用 JToken 的索引器。

当您调用 jToken 的 GetEnumerator 时,在此示例中您将仅获得单个元素,即 JProperty,因此调用实现了 JToken 的 JProperty 的索引器(通过使用字符串键)将尝试使用该索引器并抛出异常。

如果你用这种方式调用会发生什么:

jToken["output01"].ToString();

在此模式中,您使用的是 JObject 的索引器,它遍历 JObject 的 ChildrenTokens 并为您提供值。

as Guru 表示您必须使用值字段读取值或使用第一个元素。