寻求遍历JToken并修改所有JArray实例的高效方法
高效遍历JToken并移除冗余"left"数据的方案
针对你用JsonDiffPatch.net生成差异补丁后,需要移除所有无需用于撤销操作的"left"字段(以此缩减HTTP传输负载)的需求,我推荐用递归遍历+原地修改的方式,这种方法在处理JSON树形结构时既高效又易维护。
核心思路
JToken是层级化的树形结构,我们可以通过递归遍历覆盖所有节点:
- 若当前节点是
JObject,先检查并移除"left"属性,再递归处理它的所有子属性 - 若当前节点是
JArray,遍历数组内的每一个元素,对每个元素递归执行处理逻辑 - 其他类型的JToken(比如JValue)无需额外操作,直接跳过即可
实现代码
public static void RemoveLeftProperties(JToken token) { if (token.Type == JTokenType.Object) { var jObject = (JObject)token; // 移除当前对象下的"left"属性 jObject.Remove("left"); // 递归处理所有子属性(ToList()避免遍历中修改集合引发异常) foreach (var property in jObject.Properties().ToList()) { RemoveLeftProperties(property.Value); } } else if (token.Type == JTokenType.Array) { var jArray = (JArray)token; // 递归处理数组中的每一个元素 foreach (var item in jArray.ToList()) { RemoveLeftProperties(item); } } // JValue等基础类型无需处理 }
使用方式
在生成差异补丁后,直接调用这个方法处理补丁对象即可:
var jsonDiffPatch = new JsonDiffPatch(); var diff = jsonDiffPatch.Diff(oldModel, newModel); // 移除所有冗余的"left"数据 RemoveLeftProperties(diff); // 序列化处理后的补丁并发送给客户端 var serializedDiff = JsonConvert.SerializeObject(diff);
方案优势
- 内存高效:原地修改原补丁对象,无需额外创建副本,节省内存开销
- 逻辑清晰:针对不同JToken类型做针对性处理,不会遗漏任何层级的"left"字段
- 扩展性强:如果后续需要保留特定路径下的"left"字段,只需给方法添加路径过滤参数即可灵活调整
内容的提问来源于stack exchange,提问作者Sivart
相关产品推荐
相关产品推荐

