C#如何检查JSON中指定key/节点是否存在?
问题根因
你当前代码返回null的核心原因是JSON中AutomationFramework节点为数组类型,JSONPath语法规则下,未指定数组索引/通配符时无法直接定位数组内的子节点,因此你写的AutomationFramework.Technique.Available属于无效路径。
通用实现方案
你可以使用下方封装的方法,自动适配数组场景,传入原始路径即可返回节点是否存在的布尔值:
using Newtonsoft.Json.Linq; public static bool IsJsonNodeExists(JObject jsonObj, string nodePath) { // 优先查询原始路径(适配带索引的精确路径场景) var matchTokens = jsonObj.SelectTokens(nodePath, false); if (matchTokens != null && matchTokens.Any()) { return true; } // 自动适配数组场景,生成带通配符的调整后路径 var pathSegments = nodePath.Split('.'); var adjustedPathSegments = new List<string>(); JToken currentLevel = jsonObj; foreach (var seg in pathSegments) { // 当前节点是数组,自动加通配符匹配所有数组元素 if (currentLevel is JArray currentArr) { adjustedPathSegments.Add("[*]"); currentLevel = currentArr.FirstOrDefault(); if (currentLevel == null) { return false; } } // 当前节点是对象,判断是否存在当前分段的属性 if (currentLevel is JObject currentObj) { if (!currentObj.ContainsKey(seg)) { return false; } adjustedPathSegments.Add(seg); currentLevel = currentObj[seg]; } } // 用调整后的路径重新查询 matchTokens = jsonObj.SelectTokens(string.Join(".", adjustedPathSegments), false); return matchTokens != null && matchTokens.Any(); }
使用示例
// 你的原有解析逻辑 JObject obj = JObject.Parse(ParseJson(@"C:\Test\Test.Config")); // 检查第一个节点,自动适配数组结构 bool isFirstNodeExist = IsJsonNodeExists(obj, "AutomationFramework.Technique.Available"); // 检查第二个节点,直接匹配对象结构 bool isSecondNodeExist = IsJsonNodeExists(obj, "Verify.Customer");
说明
- 如果需要精确匹配数组指定索引的节点,可以直接在路径中加索引,例如
AutomationFramework[0].Technique.Available,方法会优先按原始路径查询 - 方法默认只要数组中存在任意一个符合路径的节点,就返回
True
内容的提问来源于stack exchange,提问作者Asit
相关产品推荐
相关产品推荐

