You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求遍历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);

方案优势

  1. 内存高效:原地修改原补丁对象,无需额外创建副本,节省内存开销
  2. 逻辑清晰:针对不同JToken类型做针对性处理,不会遗漏任何层级的"left"字段
  3. 扩展性强:如果后续需要保留特定路径下的"left"字段,只需给方法添加路径过滤参数即可灵活调整

内容的提问来源于stack exchange,提问作者Sivart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:36:08