如何通过Name字段值优雅地在JArray中查找对应项?
按Name字段查找JArray项的优雅写法
因为properties是JArray类型(本质是数组结构),而非JObject(键值对对象),所以直接用properties["HeatingData"]这种键索引的语法是无效的。下面是几种简洁实用的实现方式:
1. 单次查询:直接用LINQ匹配
利用LINQ的FirstOrDefault方法精准匹配Name字段,搭配空条件运算符避免空引用异常:
// 定位到Name为HeatingData的数组项 var heatingDataItem = properties.FirstOrDefault(item => item["Name"]?.ToString() == "HeatingData"); // 获取该项对应的Value对象(若未找到则返回null) var heatingDataValue = heatingDataItem?["Value"];
如果确定目标项一定存在,可替换为First()方法,但FirstOrDefault()在找不到项时返回null,安全性更高。
2. 多次复用:封装扩展方法
如果需要频繁按Name查找JArray中的项,封装一个扩展方法能让代码更简洁:
public static class JArrayExtensions { /// <summary> /// 按Name字段查找JArray中对应项的Value /// </summary> /// <param name="array">目标JArray</param> /// <param name="name">要匹配的Name值</param> /// <returns>匹配项的Value,未找到则返回null</returns> public static JToken? FindByName(this JArray array, string name) { return array.FirstOrDefault(item => item["Name"]?.ToString() == name)?["Value"]; } }
调用时只需一行代码:
var heatingData = properties.FindByName("HeatingData");
3. 多匹配项场景:获取所有结果
如果JArray中可能存在多个Name相同的项,用Where()方法获取全部匹配结果:
var allHeatingDataValues = properties.Where(item => item["Name"]?.ToString() == "HeatingData") .Select(item => item["Value"]) .ToList();
内容的提问来源于stack exchange,提问作者OlavT
相关产品推荐
相关产品推荐

