JSON.net ContractResolver与JsonConverter

fri*_*gon 56 json.net

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

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

问题:

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

Bri*_*ers 156

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

ContractResolver

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

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

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

JsonConverter

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

  • 哇,这是一个非常彻底的答案...经过一周左右的测试,我会在一些方面进行一些补充。 (2认同)
  • 正是我需要的澄清和资源。感谢您为此所做的所有辛勤工作。 (2认同)

归档时间:

查看次数:

12777 次

最近记录:

8 年,7 月 前