C# 在linq中选择两个对象,一个来自内部json数组,另一个来自外部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"
{
"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
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"
]
}
]