当前位置: 首页 > 知识库问答 >
问题:

JSON.net 合约解析器与 Json转换器

邹博明
2023-03-14

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

挑战在于,除了示例之外,我几乎没有看到关于何时应该使用一个或另一个(或两个)进行处理的解释。通过我自己的经验,我基本上已经确定合同解决器更简单,所以如果我能用它们做我需要的事情,我就会走这条路;否则,我使用自html" target="_blank">定义 JsonConverters。但是,我进一步知道两者有时一起使用,因此概念变得更加不透明。

问题:

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

共有1个答案

伊俊能
2023-03-14

好问题。我还没有看到一个明确的文档说什么时候你应该更愿意编写一个自定义的ContractResolver或一个自定义的JsonConverter来解决特定类型的问题。他们确实做不同的事情,但每个人可以解决什么样的问题之间存在一些重叠。在回答StackOverflow上的问题时,我已经写了相当多的,所以随着时间的推移,情况对我来说变得更加清晰。以下是我对它的看法。

协定解析器始终由 Json.Net 使用,并在广泛的级别上控制序列化/反序列化行为。如果设置中未提供自定义解析程序,则使用 DefaultContract 解析程序。解析程序负责确定:

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

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

  • 更改用于类型的协定
    • 将所有字典序列化为键/值对数组
    • 将列表项序列化为常规对象而不是字符串
    • 对所有属性名称使用驼峰大小写
    • 骆驼大小写除字典以外的所有属性名称
    • 在没有属性的类上全局使用 JsonConverter
    • 将属性重新映射到运行时定义的不同名称
    • 允许使用非公共资源库反序列化到公共属性
    • (可选)在运行时关闭 JsonIgnore 属性
    • 使标记为必需的属性(对于 SOAP)对于 JSON 不需要
    • 忽略所有类中的只读属性
    • 跳过序列化引发异常的属性
    • 加密任何类中特别标记的字符串属性
    • 在反序列化期间有选择地转义字符串中的 HTML

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

    • 处理反序列化时的对象实例化问题
      • 反序列化为接口,使用 JSON 中的信息来决定要实例化的具体类
      • 反序列化有时是单个对象,有时是对象数组的 JSON
      • 反序列化可以是数组或嵌套数组的 JSON
      • 从混合类型数组反序列化时跳过不需要的项目
      • 反序列化为缺少默认构造函数的对象
      • 将十进制值序列化为本地化字符串
      • 转换十进制。最小值到空字符串并返回(用于旧系统
      • 使用多种不同格式序列化日期
      • 反序列化日期时忽略 UTC 偏移
      • 在序列化类型时 Json.Net 调用 ToString()
      • 将混合值的嵌套数组反序列化为项列表
      • 反序列化具有不同名称的对象数组
      • 序列化
      • /反序列化具有复杂键的自定义字典
      • 将自定义 IEnumerable 集合序列化为字典
      • 将嵌套的 JSON 结构平展为更简单的对象结构
      • 将简单的对象结构扩展为更复杂的 JSON 结构
      • 仅将对象列表序列化为 ID 列表
      • 反序列化对象的 JSON 列表将 GUID 链接到 GUID 列表
      • 序列化 System.Net.IPAddress 引发异常
      • 反序列化 Microsoft.Xna.Framework.Rectangle 时出现问题

 类似资料:
  • 问题内容: 我正在与Json.Net解析数组。我正在尝试做的是将名称/值对从数组中拉出,并在解析JObject时将它们分配给特定的变量。 这是数组中的内容: 这是我在C#中获得的东西: 我是JSON和Json.Net的新手,因此它可能是其他人的基本解决方案。我基本上只需要在foreach循环中分配名称/值对,以便可以在前端输出数据。有人做过吗? 问题答案: 您可以这样获得数据值: 小提琴:http

  • 问题内容: 我在C#中有一个类似以下的字符串。我需要遍历并创建HTML表输出。我尝试使用JSON.NET,但无法弄清楚如何检索键(名称,年龄和工作)。 表格格式为 任何帮助将不胜感激。 Dave提供的代码在这里是理想的解决方案..但是它适用于.NET 4.0 ..我已经将JSON.NET和以下代码用于.NET 3.5 使用Newtonsoft.Json.Linq; 问题答案: 您可以使用.NET

  • 问题内容: 我有一个.NET项目。我正在使用JSON.NET库。我需要使用该库来解析一些JSON。我的JSON看起来像这样: 该对象实际上只是键/值对的列表。我试图弄清楚如何使用JSON.NET来1)解析此JSON和2)通过键/值对进行循环。有没有办法做到这一点?如果是这样,怎么办? 我唯一看到的是将反序列化为强类型的对象。 非常感谢! 问题答案: 您可以反序列化为 由于JObject实现,因此您

  • 问题内容: 我有一个场景。 必需的输入和输出是JSON。 我需要一些转换代码或最好是xslt类型的语言才能将json从一种格式转换为另一种格式。该变压器也需要快速运行,因为转换将即时进行。 编辑 我没有收到INPUT对象的定义,它可能会在运行时更改。但是如果需要,我可以将类用于OUTPUT对象。我尝试以 json- > xml-> xslt-> xml-> json的方式进行此操作 ,但 此刻 每

  • 我试图将JSON文件中的数据显示到Listview中,但是我得到了以下解析错误。 下面是我的JSON文件: 下面是我的代码:

  • 我正在尝试将JSON文件从下面的命令转换为CSV格式: 我尝试了jq命令如下,但没有成功: 或 所需输出如下所示:

  • 问题内容: 我正在使用JSON解析器提取值,并且正在使用以下jar json- path-2.1.0,当我调用在weblogic服务器上部署为webservice的用例时,出现以下错误:从json字符串中提取值,效果很好,但是用例的服务器版本引起了问题。我不确定耳朵中是否还有其他罐子会对这产生负面影响 问题答案: 偶然发现了同样的问题。 它不起作用的原因不是JDK8。之所以遇到此问题,是因为web

  • 我使用JSON解析器来提取值,并使用以下jar json-path-2.1.0,当我在weblogic服务器上调用作为webservice部署的用例时,我得到了以下错误。我编写了一个小的主程序来从JSON字符串中提取值,它工作得很好,但是用例的服务器版本给出了问题。我不确定是否有任何其他罐子的一部分,我的耳朵可以负面影响这一点