如何降低嵌套JSON查询BookName的递归函数复杂度?
优化嵌套JSON中查找第一个"BookName"值的递归函数
你当前的函数复杂度高的核心原因是反复将对象序列化为字符串再反序列化,这会带来大量不必要的性能开销,同时用字符串判断JSON类型(开头结尾)也不够严谨。下面是简化且性能更优的实现方案:
优化思路
- 一次性将整个JSON解析为
JToken(Newtonsoft.Json.Linq中的核心类型),避免多次序列化反序列化操作 - 直接基于
JToken的类型(JObject/JArray)进行遍历,替代不可靠的字符串开头结尾判断 - 递归遍历嵌套结构,找到第一个匹配的键就立即返回,提前终止无效遍历
- 统一对象和数组的遍历逻辑,简化代码结构
优化后的代码
using Newtonsoft.Json.Linq; private string FindBookName(string bookJsonString) { var rootToken = JToken.Parse(bookJsonString); return TraverseTokenForBookName(rootToken); } private string TraverseTokenForBookName(JToken token) { // 处理JSON对象 if (token is JObject jObject) { foreach (var property in jObject.Properties()) { // 匹配目标键(忽略大小写) if (string.Equals(property.Name, "BookName", StringComparison.OrdinalIgnoreCase)) { return property.Value.ToString(); } // 递归遍历当前属性的值 var result = TraverseTokenForBookName(property.Value); if (!string.IsNullOrEmpty(result)) { return result; } } } // 处理JSON数组 else if (token is JArray jArray) { foreach (var item in jArray) { var result = TraverseTokenForBookName(item); if (!string.IsNullOrEmpty(result)) { return result; } } } // 非对象/数组类型,直接返回空 return string.Empty; }
关键优化点说明
- 性能提升:仅需解析一次JSON,后续递归直接操作内存中的JToken结构,彻底消除重复序列化反序列化的开销
- 可靠性增强:用
JToken的类型判断替代字符串匹配,避免因JSON字符串前后有空格等特殊情况导致的判断错误 - 逻辑简洁:拆分出专门的遍历方法,职责更清晰,代码结构更易维护
- 提前终止:一旦找到目标值立即返回,不会继续遍历无关节点,减少不必要的计算
内容的提问来源于stack exchange,提问作者Rafa
相关产品推荐
相关产品推荐

