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

