gpt4 book ai didi

c# - 如何在 C# 中获取嵌套的 JSON 值?

转载 作者:太空宇宙 更新时间:2023-11-03 22:40:11 27 4
gpt4 key购买 nike

我从服务返回了以下 JSON 字符串:

{
"links": {
"data": {
"self": {
"body": "",
"content_type": "",
"href": "",
"method": "GET",
"name": ""
}
}
},
"results": [{
"data": {
"categories": {
"41370_10": "abc",
"41370_11": "abc",
"41370_2": "abc",
"41370_5": "abc"
}
},
"metadata": {
"categories": {
"41370": {
"key": "41370",
"name": "123"
},
"41370_10": {
"bulk_shared": false,
"key": "41370_10",
"name": "some name"
},
"41370_11": {
"allow_undefined": false,
"key": "41370_11",
"name": "some name 2"
},
"41370_2": {
"key": "41370_2",
"key_value_pairs": false,
"name": "some name 3"
}
}
}
},
{
"data": {
"categories": {
"72051_2": "asd",
"72051_3": "asd"
}
},
"metadata": {
"categories": {
"72051": {
"key": "72051",
"name": "some name 4"
},
"72051_2": {
"key": "72051_2",
"name": "some name 5"
}
}
}
},
{
"data": {
"categories": {
"112644_2": "zxc"
}
},
"metadata": {
"categories": {
"112644": {
"key": "112644",
"name": "some name 6"
},
"112644_2": {
"hidden": false,
"key": "112644_2",
"name": "some name 7"
}
}
}
}]
}

我如何处理这些数据以获得一个漂亮、简单的词典?它看起来像这样:

{"some name", "abc"}, 
{"some name 2", "abc"},
{"some name 3", "abc"},
{"some name 5", "asd"},
{"some name 6", "zxc"}

目前正在尝试使用 c#、json.net,但收效甚微。非常感谢任何帮助。

更新 1:我已经尽可能地从中获取 JTokens,但我不确定如何将数据与元数据分开(是的,我意识到这听起来很荒谬)。

//get json object
JObject cjob = JObject.Parse(response.Content.ReadAsStringAsync().Result);

IEnumerable<JToken> categorymetadata = cjob.Descendants()
.Where(t => t.Type == JTokenType.Property && ((JProperty)t).Name == "categories")
.SelectMany(p => ((JProperty)p).Value);

最佳答案

以下LINQ-to-JSON查询应该给你你正在寻找的结果:

Dictionary<string, string> dict = cjob["results"]
.Children<JObject>()
.Select(result => result.SelectToken("metadata.categories").Children<JProperty>()
.Join(result.SelectToken("data.categories").Children<JProperty>(),
metaCat => metaCat.Name,
dataCat => dataCat.Name,
(metaCat, dataCat) => new
{
Name = (string)metaCat.Value["name"],
Value = (string)dataCat.Value
}
)
)
.SelectMany(a => a)
.ToDictionary(a => a.Name, a => a.Value);

foreach (var kvp in dict)
{
Console.WriteLine(kvp.Key + ": " + kvp.Value);
}

这会在 metadata 对象中的类别和 data 对象中的类别之间为每个结果进行内部连接,并将连接的属性选择到列表中(实际上是 IEnumerable)匿名名称-值对。然后将成对的列表扁平化为单个列表,最后放入字典中。

我对您的数据做出以下假设:

  • 每个结果对象将始终具有元数据和数据
  • 类别名称和数据值始终是字符串
  • 类别名称在所有结果中都是唯一的

如果这些假设不成立,您将遇到错误并需要对代码进行调整。

这是一个工作演示:https://dotnetfiddle.net/WkztV5

关于c# - 如何在 C# 中获取嵌套的 JSON 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52655056/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com