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

如何用JSONPath获取含空Positions数组的JSON节点(Newtonsoft.Json)

解决递归获取含空Positions数组的JSON节点问题

一、正确的JSONPath查询语句

你之前的查询失败是因为混淆了JavaScript和Newtonsoft.Json的JSONPath语法差异——Newtonsoft不支持length()方法,判断数组长度需要用.Count属性。同时要先校验Positions属性存在,避免空引用异常。

正确的查询语句:

$..[?(@.Positions != null && @.Positions.Count == 0)]

代码示例

using Newtonsoft.Json.Linq;

// 替换为你的JSON字符串
string jsonContent = @"
{
  ""Id"": 1,
  ""Name"": ""Root"",
  ""Children"": [
    {
      ""Id"": 2,
      ""Name"": ""Child1"",
      ""Positions"": []
    },
    {
      ""Id"": 3,
      ""Name"": ""Child2"",
      ""Children"": [
        {
          ""Id"": 4,
          ""Name"": ""GrandChild"",
          ""Positions"": []
        }
      ]
    }
  ]
}";

JToken root = JToken.Parse(jsonContent);
IEnumerable<JToken> targetNodes = root.SelectTokens("$..[?(@.Positions != null && @.Positions.Count == 0)]");

// 输出结果
foreach (var node in targetNodes)
{
    Console.WriteLine(node.ToString(Newtonsoft.Json.Formatting.Indented));
}

二、递归遍历实现方法

如果JSON结构嵌套复杂,或者JSONPath存在局限性,递归遍历节点的方式更可靠,能精准控制判断逻辑:

代码示例

using Newtonsoft.Json.Linq;
using System.Collections.Generic;

public static class JsonNodeHelper
{
    public static List<JObject> GetNodesWithEmptyPositions(JToken rootToken)
    {
        List<JObject> result = new List<JObject>();
        TraverseNode(rootToken, result);
        return result;
    }

    private static void TraverseNode(JToken token, List<JObject> collectedNodes)
    {
        // 处理对象节点
        if (token is JObject obj)
        {
            // 检查是否包含空Positions数组
            if (obj.TryGetValue("Positions", out JToken positionsToken) 
                && positionsToken is JArray positionsArray 
                && positionsArray.Count == 0)
            {
                collectedNodes.Add(obj);
            }

            // 递归遍历所有子节点
            foreach (var child in obj.Values())
            {
                TraverseNode(child, collectedNodes);
            }
        }
        // 处理数组节点,遍历数组内的每个元素
        else if (token is JArray array)
        {
            foreach (var item in array)
            {
                TraverseNode(item, collectedNodes);
            }
        }
    }
}

// 使用方法
string jsonContent = "你的JSON字符串";
JToken root = JToken.Parse(jsonContent);
List<JObject> targetNodes = JsonNodeHelper.GetNodesWithEmptyPositions(root);

foreach (var node in targetNodes)
{
    Console.WriteLine(node.ToString(Newtonsoft.Json.Formatting.Indented));
}

关键说明

  • Newtonsoft.Json的JSONPath语法基于.NET对象属性,因此数组长度用Count而非JavaScript的length()。
  • 递归遍历方法可以灵活扩展判断逻辑,比如增加其他属性校验,适配更复杂的JSON结构。

内容的提问来源于stack exchange,提问作者AtomicBIM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:46:57