我已经和JSON.net合作了一段时间。我已经编写了自定义转换器和自定义合约解析器(通常来自S.O.和Newtonsoft网站上的修改示例),它们工作正常。
除了示例之外,我还面临的挑战是,我何时应该使用其中一个(或两个)进行处理。根据我自己的经验,我基本上已经确定合同解决方案更简单,所以如果我能够做到我需要的东西,我就这样走;否则,我使用自定义JsonConverters。但是,我进一步知道两者有时一起使用,因此概念变得更加不透明。
问题:
答案 0 :(得分:131)
好问题。我还没有看到一篇明确的文档说明您何时应该编写自定义ContractResolver
或自定义JsonConverter
来解决特定类型的问题。他们真的做了不同的事情,但每种问题可以解决哪些问题之间存在一些重叠。在回答有关StackOverflow的问题时,我已经写了相当多的数字,所以随着时间的推移,我的情况变得更加清晰了。以下是我的看法。
合约解析程序始终由Json.Net使用,并在广泛的层面上管理序列化/反序列化行为。如果设置中未提供自定义解析程序,则使用DefaultContractResolver
。解析器负责确定:
JObject
,普通旧对象等); [JsonProperty]
,[JsonIgnore]
,[JsonConverter]
等)和一般来说,如果要在各种类中自定义序列化或反序列化的某些方面,则可能需要使用ContractResolver
来执行此操作。以下是您可以使用ContractResolver
自定义的一些示例:
与ContractResolver
相比,JsonConverter
的焦点更为狭窄:它实际上旨在处理单个类型或相关类型的一小部分的序列化或反序列化。此外,它的工作水平低于解析器的水平。当转换器负责某个类型时,它可以完全控制如何为该类型读取或写入JSON:它直接使用JsonReader
和JsonWriter
类来完成其工作。换句话说,它可以更改该类型的JSON的形状。同时,转换器与“大图”分离,并且无法访问上下文信息,例如被(de)序列化的对象的父级或与其一起使用的属性属性。以下是您可以使用JsonConverter
解决问题的一些示例: