如何判断JSON结果中是否含名为data的数组并获取其父对象名
检测JSON中的"data"数组并获取其父对象
下面针对.NET生态中两种主流JSON处理库,给出具体实现方案:
使用Newtonsoft.Json(Json.NET)
这是.NET社区广泛使用的JSON处理库,实现步骤如下:
- 将JSON字符串解析为
JObject对象 - 遍历节点查找键为
"data"且值为数组类型的项,记录其父对象的键名 - 找到后即可通过
jo[父键名]["data"]的形式访问目标数组
示例代码(针对顶层子对象的场景)
using Newtonsoft.Json.Linq; string jsonStr = "你的JSON返回字符串"; JObject rootObj = JObject.Parse(jsonStr); string parentKey = null; JArray dataArray = null; // 遍历所有顶层属性 foreach (var prop in rootObj.Properties()) { if (prop.Value.Type == JTokenType.Object) { var childObj = prop.Value as JObject; // 检查当前子对象是否包含"data"数组 if (childObj.ContainsKey("data") && childObj["data"].Type == JTokenType.Array) { parentKey = prop.Name; dataArray = childObj["data"] as JArray; break; } } } // 结果判断 if (parentKey != null && dataArray != null) { Console.WriteLine($"找到data数组,父对象键为:{parentKey}"); // 后续可通过rootObj[parentKey]["data"]操作数组 } else { Console.WriteLine("未找到符合要求的data数组"); }
递归遍历版(适配更深层级的JSON结构)
如果data数组可能存在于更深的嵌套对象中,可以用递归遍历所有节点:
private static void FindDataArrayParent(JToken token, ref string parentKey, ref JArray dataArray) { if (token.Type == JTokenType.Object) { foreach (var prop in (JObject)token) { if (prop.Key == "data" && prop.Value.Type == JTokenType.Array) { // 获取当前对象的父节点键名 var parentProp = token.Parent as JProperty; parentKey = parentProp?.Name; dataArray = prop.Value as JArray; return; } FindDataArrayParent(prop.Value, ref parentKey, ref dataArray); if (parentKey != null) break; } } } // 调用方式 string parentKey = null; JArray dataArray = null; FindDataArrayParent(rootObj, ref parentKey, ref dataArray);
使用System.Text.Json(.NET Core 3.0+内置)
如果使用.NET Core或.NET 5+版本,可直接用官方内置的System.Text.Json库:
using System.Text.Json; string jsonStr = "你的JSON返回字符串"; using JsonDocument doc = JsonDocument.Parse(jsonStr); string parentKey = null; JsonElement dataArray = default; void TraverseJson(JsonElement element, string currentParentKey) { if (element.ValueKind == JsonValueKind.Object) { foreach (var prop in element.EnumerateObject()) { if (prop.Name == "data" && prop.Value.ValueKind == JsonValueKind.Array) { parentKey = currentParentKey; dataArray = prop.Value; return; } TraverseJson(prop.Value, prop.Name); if (parentKey != null) break; } } } TraverseJson(doc.RootElement, null); if (parentKey != null) { Console.WriteLine($"找到data数组,父对象键为:{parentKey}"); // 后续可通过重新解析后,用root.GetProperty(parentKey).GetProperty("data")访问数组 } else { Console.WriteLine("未找到符合要求的data数组"); }
注意事项
- 如果JSON中存在多个
"data"数组,上述代码会返回第一个匹配项;若需收集所有匹配结果,只需修改逻辑存储所有符合条件的父键 - 建议在解析JSON时添加
try-catch块,处理格式错误等异常情况
内容的提问来源于stack exchange,提问作者Don2
相关产品推荐
相关产品推荐

