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

如何让C# NewtonSoft反序列化器复用已创建对象?

复用已有对象进行Newtonsoft.Json反序列化的方案

嘿,这个问题我之前也踩过坑!Newtonsoft.Json确实没有你想要的JsonConvert.DeserializeObject(value, obj)直接重载,但别担心,有个专门的方法能完美解决这个需求——JsonConvert.PopulateObject。

核心解决方案:使用PopulateObject

这个方法的作用就是把JSON数据填充到你已经创建好的对象实例中,完全复用现有对象,不会让反序列化器新建实例。直接上代码示例:

// 先创建好需要复用的对象(可以传入构造函数参数初始化)
CustomObject obj = new CustomObject(yourConstructorArgs);

// 将JSON数据填充到已有对象里
string jsonValue = "..."; // 你的JSON字符串
JsonConvert.PopulateObject(jsonValue, obj);

执行完之后,obj就会被JSON中的数据更新,同时保留你通过构造函数初始化的原有状态(只要JSON里没覆盖对应的属性)。

常见需求场景(对应你的疑问)

通常大家需要复用对象的原因不外乎这几种:

  • 对象通过构造函数初始化了复杂的依赖、配置或内部状态,重新创建会丢失这些内容
  • 希望保留对象中JSON未包含的属性值,不被新实例覆盖
  • 性能优化场景,避免频繁创建和销毁对象带来的开销

进阶:自定义处理复杂场景

如果你的对象有私有属性、需要特殊的赋值逻辑,或者要处理嵌套对象的复用,可以自定义JsonConverter来实现更精细的控制。比如在ReadJson方法中,优先复用已有对象:

public class CustomObjectConverter : JsonConverter<CustomObject>
{
    public override CustomObject ReadJson(JsonReader reader, Type objectType, CustomObject existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 如果已有对象,就用它;没有才新建
        var target = existingValue ?? new CustomObject();
        // 填充数据到目标对象
        serializer.Populate(reader, target);
        return target;
    }

    public override void WriteJson(JsonWriter writer, CustomObject value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

使用的时候,把转换器加到序列化设置里:

var settings = new JsonSerializerSettings();
settings.Converters.Add(new CustomObjectConverter());

// 传入已有对象作为第三个参数实现复用
JsonConvert.DeserializeObject<CustomObject>(jsonValue, settings, obj);

不过大部分情况下,PopulateObject已经足够满足需求,自定义转换器是针对特殊场景的补充。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:24:37