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