如何用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
相关产品推荐
相关产品推荐

