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

如何在Newtonsoft序列化时自动为指定属性包含类型信息

Newtonsoft.Json指定属性序列化自动携带类型信息的实现方案

可以实现你需要的效果,Newtonsoft.Json原生支持在属性/类级别通过特性指定类型信息携带规则,无需每次手动传入序列化选项。

正确实现方式

你想要的属性级别配置只需要将对应特性替换为JsonProperty并设置TypeNameHandling参数即可,示例代码如下:

public abstract class Value { }
public class BigValue : Value 
{
    public int BigNumber { get; set; }
}
public class SmallValue : Value 
{
    public short SmallNumber { get; set; }
}

public class ValueContainer
{
    // 仅当前属性序列化时强制携带类型信息
    [JsonProperty(TypeNameHandling = TypeNameHandling.All)]
    public Value TheValue { get; set; }
}

序列化测试

直接调用默认序列化方法即可输出带$type字段的JSON:

var container = new ValueContainer
{
    TheValue = new BigValue { BigNumber = 10086 }
};
// 无需传入额外序列化配置
string json = JsonConvert.SerializeObject(container);

输出的JSON示例:

{
    "TheValue": {
        "$type": "你的命名空间.BigValue, 你的程序集名称",
        "BigNumber": 10086
    }
}

其他适用场景

  • 若需要整个类的所有属性都携带类型信息,可直接在类上添加[JsonObject(TypeNameHandling = TypeNameHandling.All)]特性
  • 若需要某个类型所有被引用的场景都自动携带类型信息,可直接在该类型(比如你示例中的Value抽象类)上添加[JsonObject(TypeNameHandling = TypeNameHandling.All)]特性
  • 属性级别的配置优先级高于全局序列化配置,不会被全局设置覆盖
  • 反序列化时只要保持该特性配置,不需要额外传参即可自动识别类型完成反序列化

内容的提问来源于stack exchange,提问作者SørenHN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:27:04