JSON.net ContractResolver与JsonConverter

时间:2016-12-11 16:40:33

标签: json.net

我已经和JSON.net合作了一段时间。我已经编写了自定义转换器和自定义合约解析器(通常来自S.O.和Newtonsoft网站上的修改示例),它们工作正常。

除了示例之外,我还面临的挑战是,我何时应该使用其中一个(或两个)进行处理。根据我自己的经验,我基本上已经确定合同解决方案更简单,所以如果我能够做到我需要的东西,我就这样走;否则,我使用自定义JsonConverters。但是,我进一步知道两者有时一起使用,因此概念变得更加不透明。

问题:

  1. 是否存在区分何时用户与其他用户的来源?我发现Newtonsoft文档不清楚这两者是如何区分的,或何时使用其中一种。
  2. 两者之间的排序管道是什么?

1 个答案:

答案 0 :(得分:131)

好问题。我还没有看到一篇明确的文档说明您何时应该编写自定义ContractResolver或自定义JsonConverter来解决特定类型的问题。他们真的做了不同的事情,但每种问题可以解决哪些问题之间存在一些重叠。在回答有关StackOverflow的问题时,我已经写了相当多的数字,所以随着时间的推移,我的情况变得更加清晰了。以下是我的看法。

ContractResolver

合约解析程序始终由Json.Net使用,并在广泛的层面上管理序列化/反序列化行为。如果设置中未提供自定义解析程序,则使用DefaultContractResolver。解析器负责确定:

  • 每种类型的契约(即它是原语,数组/列表,字典,动态,JObject,普通旧对象等);
  • 类型上有哪些属性(如果有)以及它们的名称,类型和可访问性;
  • 已应用attributes的内容(例如[JsonProperty][JsonIgnore][JsonConverter]等)和
  • 这些属性应如何影响每个属性(或类)的(反)序列化。

一般来说,如果要在各种类中自定义序列化或反序列化的某些方面,则可能需要使用ContractResolver来执行此操作。以下是您可以使用ContractResolver自定义的一些示例:

JsonConverter

ContractResolver相比,JsonConverter的焦点更为狭窄:它实际上旨在处理单个类型或相关类型的一小部分的序列化或反序列化。此外,它的工作水平低于解析器的水平。当转换器负责某个类型时,它可以完全控制如何为该类型读取或写入JSON:它直接使用JsonReaderJsonWriter类来完成其工作。换句话说,它可以更改该类型的JSON的形状。同时,转换器与“大图”分离,并且无法访问上下文信息,例如被(de)序列化的对象的父级或与其一起使用的属性属性。以下是您可以使用JsonConverter解决问题的一些示例: