C# Newtonsoft.Json反序列化后合并两个相同模型类对象的方法
开发环境
- 技术栈:C#、Newtonsoft.JSON
现有代码定义
实体类定义
class RolePerson { public NodeRolePerson[] Items { get; set; } } class NodeRolePerson { public bool active { get; set; } public string dateUva { get; set; } public bool delegated { get; set; } public NodeentityOrg entityOrg { get; set; } // 其余属性省略 public string userUva { get; set; } }
现有反序列化逻辑
RolePerson myP1 = JsonConvert.DeserializeObject<RolePerson>(data1, settings); RolePerson myP2 = JsonConvert.DeserializeObject<RolePerson>(data2, settings);
问题说明
需要将myP1、myP2两个对象整合为一个RolePerson实例。
之前尝试的写法存在两个问题:
- 仅声明了
List<RolePerson> trace,未对变量初始化实例就调用Add方法,会触发“使用了未赋值的局部变量”编译错误,正确的列表初始化写法应为List<RolePerson> trace = new List<RolePerson>(); - 该写法仅将两个独立对象存入集合,并未合并为单个
RolePerson对象,不符合需求。
实现方案
RolePerson类的核心业务数据存储在Items数组属性中,合并逻辑本质是拼接两个实例的Items集合,再赋值给新的RolePerson实例即可。
基础合并(保留所有条目)
// 空值防护,避免反序列化返回null时触发空引用 myP1 ??= new RolePerson { Items = Array.Empty<NodeRolePerson>() }; myP2 ??= new RolePerson { Items = Array.Empty<NodeRolePerson>() }; // 拼接两个Items数组生成合并后的实例 RolePerson mergedResult = new RolePerson { Items = myP1.Items.Concat(myP2.Items).ToArray() };
去重合并(重复条目仅保留一份)
如果两个源对象中存在重复的人员数据,可按唯一标识(比如userUva字段)去重:
myP1 ??= new RolePerson { Items = Array.Empty<NodeRolePerson>() }; myP2 ??= new RolePerson { Items = Array.Empty<NodeRolePerson>() }; RolePerson mergedResult = new RolePerson { Items = myP1.Items .Concat(myP2.Items) .GroupBy(p => p.userUva) // 按人员唯一标识分组 .Select(g => g.First()) // 每组取第一条,可按需调整保留规则 .ToArray() };
注意:使用
Concat方法需要引入System.Linq命名空间,代码文件顶部需添加using System.Linq;
内容的提问来源于stack exchange,提问作者Franco
相关产品推荐
相关产品推荐

