gpt4 book ai didi

c# - 使用嵌套数组的 LINQ to JSON 查询的正确语法

转载 作者:行者123 更新时间:2023-11-30 22:03:48 24 4
gpt4 key购买 nike

我有一个类似 Json 的“数据库”,我正在尝试使用 Newtonsoft Json.Net LINQ 从中提取内容。

目标是从包含在父数组中的项目中的子数组中的项目中提取属性。父数组中的项目将由键属性选择。“外部”元素是一个只有一个条目的数组,“内部”元素是一个包含两个父项的数组,每个父项都有一个“键”和一个子“项”数组。希望通过键匹配内部父项目,然后将子数组中所有项目的子“itemid”属性提取到 IList 中。

file at filePath contains:
{
"outer":
[
{
"inner":
[
{
"key": "AAA",
"items":
[
{ "itemid": "a1" }
]
},
{
"key": "BBB",
"items":
[
{ "itemid": "b1" },
{ "itemid": "b2" }
]
}
]
}
]
}

我认为提取查询看起来会像下面显示的那样,但是这个和我尝试过的几十个变体中的任何一个都没有成功。在某些变体中,它似乎一直工作到最终选择正确的内部“项目”,但当我试图挖掘出“itemid”数组时,它就分崩离析了。任何线索这里出了什么问题?如果需要,我愿意将其分成两个单独的查询。

public IList<string> FindMatchingItems(string filePath, string id)
{
JObject JsonLinq = JObject.Parse(File.ReadAllText(filePath));
return JsonLinq["outer"].First()["inner"].Children()
.First(inner => inner["key"].ToString() == id)
.Select(selected => selected["items"].Children()["itemid"].ToString())
.ToList();
}

void Query(string filePath)
{
var ayes = FindMatchingItems(filePath, "AAA");
// ayes contains [] { "a1" }

var bees = FindMatchingItems(filePath, "BBB");
// bees contains [] { "b1", "b2" }
}

最佳答案

我想这就是您要找的:

JsonLinq["outer"].First()["inner"]
.Where(innerItem => innerItem["key"].Value<string>() == id)
.SelectMany(innerItem => innerItem["items"]
.Select(itm => itm["itemid"].Value<string>()))
.ToList();

这里的关键是使用 .SelectMany 将投影的 itemid 展平到一个新列表中。

关于c# - 使用嵌套数组的 LINQ to JSON 查询的正确语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25772788/

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