【问题标题】:JSon.Net how to have $type only for deserializationJSon.Net 如何让 $type 仅用于反序列化
【发布时间】:2015-11-24 22:49:42
【问题描述】:

我使用 Json 中的 $type 属性来反序列化继承的对象(选择正确的对象类型以在运行时反序列化)

我这样做是使用:

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings{ TypeNameHandling = TypeNameHandling.Objects} 

此行在 WebApiConfig 文件中。

它工作正常,但我不知道如何将 $type 限制为仅用于实际需要它的 web 服务(我只需要一个 PUT 和一个 POST)。 $type 搞乱了其他 web 服务的 API 结果,我找不到一些 TypeNameHandling 配置,也找不到一些序列化选项来避免这种情况。 有谁知道该怎么做? 干杯!

【问题讨论】:

  • 根对象需要 $type 还是嵌套对象?
  • 我需要它用于嵌套对象。至少现在……我仍然可以重构并在根目录下使用它。

标签: c# json serialization json.net


【解决方案1】:

要对嵌套对象启用类型名称处理,您可以将 [JsonProperty(ItemTypeNameHandling = TypeNameHandling.Objects)] 附加到包含属性,如下所示:

public class RootObject
{
    [JsonProperty(ItemTypeNameHandling = TypeNameHandling.Objects)]
    public object Data { get; set; }
}

没有内置方法可以在特定类型上启用类型名称处理,因此没有内置方法可以在根对象上启用类型名称处理。相反,如果需要,您可以使用 SignalR Typenamehandling 中的 EnableJsonTypeNameHandlingConverter

【讨论】:

    【解决方案2】:

    感谢 dbc 的帮助。我在反序列化过程中遇到了其他问题(使用 OData.Delta 对象,您提出的解决方案实际上并不完全符合需要。 由于这篇文章,我克服了这个问题:Custom Json.NET serializer settings per type 仅对少数 Web 服务进行 $type 自定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多