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

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实例。
之前尝试的写法存在两个问题:

  1. 仅声明了List<RolePerson> trace,未对变量初始化实例就调用Add方法,会触发“使用了未赋值的局部变量”编译错误,正确的列表初始化写法应为List<RolePerson> trace = new List<RolePerson>();
  2. 该写法仅将两个独立对象存入集合,并未合并为单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:18:20