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

