c# - 如何使用 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() );
}
}
}
在这里,对于所有内部记录,我们在子集中没有数据。所以我保留了空检查条件并尝试了,但是它抛出了空引用异常。
任何建议!
解决方案
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);
推荐阅读
- python - 为什么语法错误(python)不起作用?
- css - 如何去除这个边距?
- tensorflow - keras.initializers.ones() 是风格吗?
- javascript - 在 Web 应用程序中单击按钮后刷新下拉列表
- scala - 带有替代方法的重载方法值 json: (jsonRDD: org.apache.spark.rdd.RDD[String]) 在 IntelliJ 中使用 Spark
- excel - 单元格包含公式不为空
- node.js - 如何像日历一样使用 Node.js 存储日程安排
- node.js - NodeJS - 确定目标网站是否使用 HTTP/2
- python - 在仅提取数据框的多列时在日期上应用行逻辑
- c# - unity Scriptable 对象在 bulid 中不起作用