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
相关产品推荐
相关产品推荐

