gpt4 book ai didi

JSON.net ContractResolver 与 JsonConverter

转载 作者:行者123 更新时间:2023-12-03 05:48:49 24 4
gpt4 key购买 nike

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

挑战在于,除了示例之外,我几乎看不到关于何时应该使用其中一个(或两者)进行处理的解释。根据我自己的经验,我基本上确定契约(Contract)解析器更简单,所以如果我可以用它们做我需要的,我就走这条路;否则,我使用自定义 JsonConverters。但是,我进一步知道两者有时会一起使用,因此这些概念变得更加不透明。

问题:

  • 是否有一个来源可以区分何时使用一个和另一个?我发现 Newtonsoft 文档不清楚如何区分两者或何时使用其中之一。
  • 两者之间的订购管道是什么?
  • 最佳答案

    很好的问题。我还没有看到明确的文档说明您何时应该更喜欢编写自定义 ContractResolver 或定制 JsonConverter 解决特定类型的问题。他们确实做不同的事情,但是每个人可以解决的问题类型之间存在一些重叠。我在 StackOverflow 上回答问题时写了很多,所以随着时间的推移,图片对我来说变得更加清晰了。下面是我的看法。

    合约解析器

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

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

  • 一般来说,如果你想在广泛的类中自定义序列化或反序列化的某些方面,你可能需要使用 ContractResolver去做。以下是您可以使用 ContractResolver 自定义的一些示例。 :
  • 更改用于类型的契约(Contract)
  • Serialize all Dictionaries as an Array of Key/Value Pairs
  • Serialize ListItems as a regular object instead of string
  • 序列化时更改属性名称的大小写
  • Use camel case for all property names
  • Camel case all property names except dictionaries
  • 以编程方式将属性应用于属性而无需修改类(如果您不控制所述类的来源,则特别有用)
  • Globally use a JsonConverter on a class without the attribute
  • Remap properties to different names defined at runtime
  • Allow deserializing to public properties with non-public setters
  • 以编程方式取消应用(忽略)应用于某些类的属性
  • Optionally turn off the JsonIgnore attribute at runtime
  • Make properties which are marked as required (for SOAP) not required for JSON
  • Conditionally serialize属性
  • Ignore read-only properties across all classes
  • Skip serializing properties that throw exceptions
  • 引入自定义属性并基于这些属性应用一些自定义行为
  • Encrypt specially marked string properties in any class
  • Selectively escape HTML in strings during deserialization

  • Json转换器

    ContractResolver 形成对比,一个 JsonConverter的焦点更窄:它实际上旨在处理单个类型或相关类型的一小部分子集的序列化或反序列化。此外,它的工作级别低于解析器。当转换器被赋予一个类型的责任时,它可以完全控制如何为该类型读取或写入 JSON:它直接使用 JsonReader JsonWriter 类来完成它的工作。换句话说,它可以更改该类型的 JSON 的形状。同时,转换器与“大图”分离,无法访问上下文信息,例如被(反)序列化的对象的父级或与其一起使用的属性属性。以下是您可以使用 JsonConverter 解决的一些问题示例。 :
  • 处理反序列化的对象实例化问题
  • Deserialize to an interface, using information in the JSON to decide which concrete class to instantiate
  • Deserialize JSON that is sometimes a single object and sometimes an array of objects
  • Deserialize JSON that can either be an array or a nested array
  • Skip unwanted items when deserializing from an array of mixed types
  • Deserialize to an object that lacks a default constructor
  • 更改值的格式或解释方式
  • Serialize decimal values as localized strings
  • Convert decimal.MinValue to an empty string and back (用于遗留系统)
  • Serialize dates with multiple different formats
  • Ignore UTC offsets when deserializing dates
  • Make Json.Net call ToString() when serializing a type
  • 在不同的 JSON 和对象结构之间进行转换
  • Deserialize a nested array of mixed values into a list of items
  • Deserialize an array of objects with varying names
  • Serialize/deserialize a custom dictionary with complex keys
  • Serialize a custom IEnumerable collection as a dictionary
  • Flatten a nested JSON structure into a simpler object structure
  • Expand a simple object structure into a more complicated JSON structure
  • Serialize a list of objects as a list of IDs only
  • Deserialize a JSON list of objects containing GUIDs to a list of GUIDs
  • 解决(反)序列化特定 .NET 类型的问题
  • Serializing System.Net.IPAddress throws an exception
  • Problems deserializing Microsoft.Xna.Framework.Rectangle
  • 关于JSON.net ContractResolver 与 JsonConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41088492/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com