【问题标题】:C# JSON.Net parse and get list of all elements matching a value using LINQC# JSON.Net 使用 LINQ 解析并获取与值匹配的所有元素的列表
【发布时间】:2014-08-10 16:51:21
【问题描述】:

我无法找到从 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”的数组?

【问题讨论】:

  • 我的意思是“_name”而不是“_id”,已修复
  • 您真的打算让doc.bob 成为一个数组,其中包含一个具有tom 属性的对象,而该对象具有frank 属性?
  • 这不是我的 JSON,它来自其他地方。我简化了它。我每隔几秒钟就会得到它作为 Json 馈送。

标签: c# json linq


【解决方案1】:

三个问题:

  • 您不想要doc直接子代,您想要后代。
  • 您使用的是x["_name"].Value&lt;string&gt;(),即使没有没有_name 属性
  • 您甚至在非对象子级上使用 x["_name"].Value&lt;string&gt;()

这些都很容易解决:

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

【讨论】:

  • 太好了,谢谢。我一定误解了,因为在文档中它说:“返回源集合中每个数组的子令牌集合。”我认为“每个数组的子令牌”会起作用。
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2012-05-30
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多