C# 在linq中选择两个对象,一个来自内部json数组,另一个来自外部json数组

C# 在linq中选择两个对象,一个来自内部json数组,另一个来自外部json数组,c#,json,linq,C#,Json,Linq,我有一个JSON对象,看起来像这样 { "someOtherData": "notImportant", "outerlist": [ { "somedata": 1504461600, "innerList": [ { "data1": 801, "data2": "blah", "innerDataNeeded": "the inner list data needed"

我有一个JSON对象,看起来像这样

{
  "someOtherData": "notImportant",
  "outerlist": [
    {
      "somedata": 1504461600,
      "innerList": [
        {
          "data1": 801,
          "data2": "blah",
          "innerDataNeeded": "the inner list data needed"
        }
      ],
      "outerDataNeeded": "outer Data Needed"
    }
  ]
}
我试图编写一个linq查询来返回
innerDataNeeded
outerDataNeeded

因此,我编写了两个函数来获取这两个函数,但我不确定如何将它们连接在一起,并通过一个查询获得所需的结果

目前的代码是这样的

var listOfInnerData = from listItem in jsonObject["outerList"] from innerJsonList in listItem["innerList"] select (string) innerJsonList["innerDataNeeded"];
var listOfOuterData = from listItem in jsonObject["outerList"] select (string)listItem["outerDataNeeded"];

您有几个选项可以提取
innerDataNeeded
outerDataNeeded
,使用LINQ到JSON分组连接在一起

首先,您可以使用嵌套的
from
语句对内部列表执行一个操作,以生成一个连接对的单一平面列表:

var query = from outerItem in jsonObject.SelectTokens("outerlist[*]")
            let outerData = outerItem["outerDataNeeded"]
            from innerData in outerItem.SelectTokens("innerList[*].innerDataNeeded")
            select new { OuterData = (string)outerData, InnerData = (string)innerData };

var listOfData = query.ToList();
导致

其次,如果
innerList
数组可能丢失或为空,并且您仍然希望获取相应的外部数据值,则可以使用以下命令插入默认值:

最后,如果希望将结果列表结构化为外部集合和内部集合,可以使用嵌套LINQ查询,如下所示:

var query = from outerItem in jsonObject.SelectTokens("outerlist[*]")
            select new 
            {
                OuterData = (string)outerItem["outerDataNeeded"], 
                InnerData = outerItem.SelectTokens("innerList[*].innerDataNeeded").Select(i => i.ToString()).ToArray() 
            };

var listOfData = query.ToList();
其结果是:

显示这三个选项的示例

注释-

  • 该方法允许使用选择多个令牌。在此语法中,
    [*]
    运算符是匹配所有数组成员的通配符。使用
    SelectTokens()
    可以避免在
    JToken
    层次结构的每一级使用嵌套的
    from
    /
    select
    查询

  • 如果缺少某些属性,
    SelectTokens()
    将不会枚举任何内容,而来自
    /
    select
    的嵌套
    将抛出空引用异常,除非选中并跳过
    null

  • >p>粘贴JSON或用于生成JSON的具体类型,然后反序列化这些类型并查询结果,是另一个要考虑的选项。


将json转换为具体的类,这样您就可以更轻松地处理它。
var query = from outerItem in jsonObject.SelectTokens("outerlist[*]")
            let outerData = outerItem["outerDataNeeded"]
            from innerData in outerItem.SelectTokens("innerList[*].innerDataNeeded").DefaultIfEmpty(JValue.CreateNull())
            select new { OuterData = (string)outerData, InnerData = (string)innerData };

var listOfData = query.ToList();
var query = from outerItem in jsonObject.SelectTokens("outerlist[*]")
            select new 
            {
                OuterData = (string)outerItem["outerDataNeeded"], 
                InnerData = outerItem.SelectTokens("innerList[*].innerDataNeeded").Select(i => i.ToString()).ToArray() 
            };

var listOfData = query.ToList();
[
  {
    "OuterData": "outer Data Needed",
    "InnerData": [
      "the inner list data needed"
    ]
  }
]