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

C# 如何将动态JSON JToken解析为List<DiffModel>对象列表

可以通过遍历差异JToken的属性实现目标转换,具体实现方案如下:

前置说明

jsondiffpatch生成的差异JObject中,每个属性对应的数组遵循以下规则:

  • 数组长度为2:第一位为属性修改前的旧值,第二位为修改后的新值,对应属性修改场景
  • 数组长度为1:仅保留属性修改前的旧值,对应属性删除场景,新值默认为null
  • 数组长度为3:属于数组元素移动、长文本差异等特殊场景,你提供的示例不涉及该类情况,如有需要可额外补充处理逻辑

代码实现

首先你已经定义的DiffModel类:

public class DiffModel 
{
  public string Property { get; set; }
  public string OldValue { get; set; }
  public string NewValue { get; set; }
} 

转换方法实现:

using Newtonsoft.Json.Linq;
using System.Collections.Generic;

public List<DiffModel> ConvertToDiffModelList(JToken diffPatch)
{
    var diffList = new List<DiffModel>();
    // 空差异直接返回空列表
    if (diffPatch == null || diffPatch.Type != JTokenType.Object)
    {
        return diffList;
    }

    var diffObject = (JObject)diffPatch;
    // 遍历所有差异属性
    foreach (var property in diffObject.Properties())
    {
        var diffValues = property.Value as JArray;
        if (diffValues == null)
        {
            continue;
        }

        var model = new DiffModel
        {
            Property = property.Name
        };

        switch (diffValues.Count)
        {
            case >= 2:
                model.OldValue = diffValues[0]?.ToString();
                model.NewValue = diffValues[1]?.ToString();
                break;
            case 1:
                model.OldValue = diffValues[0]?.ToString();
                model.NewValue = null;
                break;
        }

        diffList.Add(model);
    }

    return diffList;
}

使用方法

你通过差异比较得到JToken patch = jdp.Diff(left, right)之后,直接调用转换方法即可:

List<DiffModel> result = ConvertToDiffModelList(patch);

该方法输出的结果和你期望的结构完全匹配,以你给出的示例差异JToken为例:

  • Id属性对应数组[78485, 0],转换后OldValue = "78485"、NewValue = "0"
  • PostCode属性对应数组[null],转换后OldValue = null、NewValue = null

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:24:02