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

时间:2014-08-10 16:51:22

标签: c# json linq

我找不到从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"
                    }]
                }]
            }]
        }]
    }]
}

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

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;

我收到此错误:

"Value cannot be null.\r\nParameter name: source"

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

1 个答案:

答案 0 :(得分:3)

三个问题:

  • 你不想要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");