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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:58:31