You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:13:20