首页 > 解决方案 > 如何使用 Linq 从 Json 或类对象中查找子元素

问题描述

我有一个保存 JSON 记录的对象,我想从 JSON 中获取一个内部子对象。

下面是示例 JSON,dbSettings 包含此 JSON 的所有属性。

{
  "Settings": [
  {
              "Category": "Bodies 0",
              "MDName": "CompleteDispensers",
              "subSettings": [
                {
                  "Category": "CompleteDispensers",
                  "MDName": "CompleteDispensers 0",
                  "subSettings": [
                    {
                      "Category": "CompleteDispensers 0",
                      "MDName": "dispenserTypeID",
                      "subSettings": null
                    },
                    {
                      "Category": "CompleteDispensers 0",
                      "MDName": "productID",
                      "subSettings": null
                    }
                  ]
                },
                {
                  "Category": "CompleteDispensers",
                  "MDName": "CompleteDispensers 1",
                  "subSettings": [
                    {
                      "Category": "CompleteDispensers 1",
                      "MDName": "dispenserTypeID",
                      "subSettings": null
                    },
                    {
                      "Category": "CompleteDispensers 1",
                      "MDName": "productID",
                      "subSettings": null
                    }
                  ]
                }
              ]
            }
  ]
}

我尝试了下面的代码,它正在获取空记录。

var obj = dbSettings.Settings.FirstOrDefault(_ => _.Name == 
            Constants.DispenseIDName);

当我尝试如下时,我得到了预期的值。

var result = itemTitle > itemTitle1 ? itemTitle : itemTitle1;

if (dbSettings.Settings[9].subSettings[0].subSettings[14].Name == 
        Constants.DispenseIDName)
            {
                dbSettings.Settings[9].subSettings[0].subSettings[14].Value = 
                 result.ToString();
            }

我希望这段代码是动态的。而不是使用索引值

Settings[9].subSettings[0].subSettings[14],我希望使用 Linq 或任何其他方式使用类对象查询它以在 c# 中查找内部子对象。

正如建议的那样,我尝试并获得了一个空引用异常。

 if (dbSettings.Settings.SelectMany(x => x.subSettings)!=null)
            {
                if (dbSettings.Settings.SelectMany(x => x.subSettings).SelectMany(x => x.subSettings) != null)
                {
                    if (dbSettings.Settings.SelectMany(x => x.subSettings).SelectMany(x => x.subSettings).Any(x => x.Name == Constants.DispenseIDName))
                    {
                        dbSettings.Settings.SelectMany(x => x.subSettings).SelectMany(x => x.subSettings).Any(x => x.Value == result.ToString() );
                    }
                }
            }  

在这里,对于所有内部记录,我们在子集中没有数据。所以我保留了空检查条件并尝试了,但是它抛出了空引用异常。

任何建议!

标签: c#linq

解决方案


dbSettings.SelectMany(x=>xSettings).SelectMany(x=>x.subSettings).SelectMany(x=>x.subSettings).Any(x=>x.Name == Constants.DispenseIDName);

如果任何名称与所需名称相同,这将返回 true。

示例嵌套 int 列表:

List<List<List<List<int>>>> myMegaList = new List<List<List<List<int>>>>(){
new List<List<List<int>>>{
new List<List<int>>{
new List<int>{
2,4,5,6,7
}
}
}

};

myMegaList.SelectMany(x=>x).SelectMany(x=>x).SelectMany(x=>x).Any(x=>x==2);

推荐阅读