如何用Newtonsoft.Json的SelectTokens筛选非空数组属性名?
获取Newtonsoft.Json中availability对象的非空数组属性名
你原来的表达式错误在于直接筛选数组元素,而非针对属性值本身进行判断,导致无法正确获取目标属性名。以下是两种可行的解决方案:
方案一:使用SelectTokens筛选+获取属性名
通过调整JSON Path表达式,先选中符合条件的数组值,再通过父节点获取对应的属性名:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; var item = JObject.Parse(@"{ 'date': '2024-12-27', 'availability': { '7:00': [], '8:00': [], '9:00': [], '10:00': [ { 'id': 2583 } ] } }"); // 筛选availability下值为非空数组的属性,再提取属性名 var availableTimes = item.SelectTokens("$.availability.*[?(@.length() > 0)]") .Select(token => ((JProperty)token.Parent).Name) .ToList(); // 输出结果:10:00 foreach (var time in availableTimes) { Console.WriteLine(time); }
表达式说明:
$.availability.*:匹配availability对象下的所有属性值[?(@.length() > 0)]:筛选出当前属性值(@指代当前元素)为数组且长度大于0的项- 通过
token.Parent获取对应的JProperty节点,再读取Name属性得到目标属性名
方案二:使用Linq直接遍历(更直观)
如果觉得JSON Path不够直观,也可以直接用Linq遍历availability的属性:
var availableTimes = item["availability"] .OfType<JProperty>() .Where(p => p.Value is JArray arr && arr.Count > 0) .Select(p => p.Name) .ToList();
这种方式直接枚举availability下的所有属性,判断属性值是否为非空数组,再提取属性名,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Karl Gardner
相关产品推荐
相关产品推荐

