如何让Newtonsoft.Json序列化object类型属性时保留.NET类型信息?
如何让Newtonsoft.Json为object类型的Data属性保留类型信息
问题原因
你使用TypeNameHandling.All时,Event类本身的类型信息正常生成,但Data(object类型)没有包含$type,通常是因为以下原因:
ServerVersionData不是公共类(internal),导致Json.NET无法识别并生成类型信息;- 全局的
TypeNameHandling设置没有覆盖到嵌套的object属性(少数情况)。
解决步骤
1. 确保目标类型是公共类
检查ServerVersionData的访问修饰符,必须是public,且带有公共无参构造函数(反序列化必备):
public class ServerVersionData { public ServerVersionData() { } public string Version { get; set; } public string VersionPrevious { get; set; } }
2. 为Data属性显式指定类型处理规则
在Event类的Data属性上添加JsonProperty特性,强制该属性序列化时输出类型信息:
/// <summary> /// Event data, like links, attachments, the product for example a product event and more. /// </summary> [JsonProperty(TypeNameHandling = TypeNameHandling.All)] public object? Data { get; set; }
3. 保持序列化配置正确
你的现有序列化代码无需大改,确保TypeNameHandling设置为All即可:
var s = JsonConvert.SerializeObject(events, Formatting.None, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All, // 可选:简化类型名称格式,只保留类名和程序集名 // TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple });
预期效果
修改完成后,序列化后的JSON中Data字段会包含$type信息:
"Data": { "$type": "你的命名空间.ServerVersionData, 你的程序集名称", "versionPrevious": "0.0.0.0", "version": "1.0.0" }
反序列化注意事项
反序列化时必须同样启用TypeNameHandling.All,确保Json.NET能识别并还原为具体类型:
var events = JsonConvert.DeserializeObject<List<Event>>(json, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All });
内容的提问来源于stack exchange,提问作者sommmen
相关产品推荐
相关产品推荐

