C# JSON.Net 使用 LINQ 解析并获取与某个值匹配的所有元素的列表

Vix*_*inG 2 c# linq json

我无法找到从 JObject 获取 json 数组列表的正确方法。
_name数组内的元素应等于foo

这是示例 json:

{
    "doc": [{
        "bob": [{
            "tom": [{
                "frank": [{
                    "category": [{
                        "_name": "foo",
                        "letters": "abc"
                    },
                    {
                        "_name": "foo",
                        "letters": "def"
                    },
                    {
                        "_name": "foo",
                        "letters": "ghi"
                    },
                    {
                        "_name": "foo",
                        "letters": "jkl"
                    }]
                }]
            }]
        }]
    }]
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我的代码:

JObject o = JObject.Parse(File.ReadAllText(@"D:/Client/data.json"));

var results = from x in o["doc"].Children()
              where x["_name"].Value<string>() == "foo"
              select x;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

"Value cannot be null.\r\nParameter name: source"
Run Code Online (Sandbox Code Playgroud)

如何获得一个列表,其中每个元素都是包含“_name”和“字母”的数组?

Jon*_*eet 5

三个问题:

  • 你不想要的直系孩子doc,你想要后代。
  • x["_name"].Value<string>()即使没有财产_name,您也在使用
  • x["_name"].Value<string>()你甚至在非对象儿童上使用

不过,这些都很容易解决:

var doc = (JContainer) o["doc"];
var results = doc.Descendants()
                 .OfType<JObject>()
                 .Where(x => x["_name"] != null &&
                             x["_name"].Value<string>() == "foo");
Run Code Online (Sandbox Code Playgroud)