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

C#中如何将多次反序列化的JSON数据合并到已有类实例?

合并多次API请求的反序列化结果到已有实例

方法一:直接合并集合(最简便)

如果你的MyCLASS中Data是List<T>这类支持批量添加的集合类型,直接反序列化到临时对象,再将临时对象的Data追加到已有实例的集合中即可:

// 初始化已有实例
var existingInstance = new MyCLASS();

do
{
    // 请求API获取响应内容
    var content = await GetApiResponseContentAsync();
    // 反序列化到临时对象
    var tempInstance = JsonConvert.DeserializeObject<MyCLASS>(content);
    // 合并Data集合
    existingInstance.Data.AddRange(tempInstance.Data);
    // 判断是否还有更多数据(根据API返回的分页标识调整)
} while (tempInstance.HasMore);

方法二:结合PopulateObject更新非集合属性

如果MyCLASS除了Data集合外,还有其他需要更新的属性(比如总条数、分页参数),可以用JsonConvert.PopulateObject更新已有实例的非集合属性,再单独合并集合:

var existingInstance = new MyCLASS();

do
{
    var content = await GetApiResponseContentAsync();
    var tempInstance = JsonConvert.DeserializeObject<MyCLASS>(content);
    // 更新已有实例的非集合属性(会覆盖原有值,按需使用)
    JsonConvert.PopulateObject(content, existingInstance);
    // 追加Data集合
    existingInstance.Data.AddRange(tempInstance.Data);
} while (tempInstance.HasMore);

注意:PopulateObject会覆盖已有属性的值,若有不需要覆盖的属性,需提前做保留处理。

方法三:自定义JsonConverter(复杂场景)

如果你的MyCLASS结构特殊,需要更灵活的合并逻辑,可以自定义转换器,在反序列化时直接完成合并:

public class MergingMyClassConverter : JsonConverter
{
    private readonly MyCLASS _targetInstance;

    public MergingMyClassConverter(MyCLASS targetInstance)
    {
        _targetInstance = targetInstance;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(MyCLASS);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var temp = serializer.Deserialize<MyCLASS>(reader);
        // 合并Data集合
        _targetInstance.Data.AddRange(temp.Data);
        // 按需合并其他属性,比如总条数取最后一次返回的值
        _targetInstance.TotalCount = temp.TotalCount;
        return _targetInstance;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

使用方式:

var existingInstance = new MyCLASS();
do
{
    var content = await GetApiResponseContentAsync();
    var serializer = new JsonSerializer();
    using var reader = new JsonTextReader(new StringReader(content));
    // 传入目标实例,反序列化时直接合并
    serializer.Deserialize(reader, new MergingMyClassConverter(existingInstance));
} while (existingInstance.HasMore);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:00:08