迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 >

Gson Builder 使用 Lenient 放宽 Gson 的转换标准

作者:迹忆客 最近更新:2023/02/01 浏览次数:

JSON 内容的格式必须满足一些特定的规则才能符合标准。 该标准在 RFC4627 规范中进行了描述。 它为键和值的分离方式、数组的结构等奠定了基础。 在这篇文章中,我们将探讨 Gson 与 JSON 规范的关系。


默认 Lenient

首先,当 Gson 序列化 Java 对象时,它会创建一个 100% 符合标准的 JSON。 有趣的部分是 Gson 在反序列化过程中的行为方式!

在内部,Gson 使用了一个 JsonReader 类。 该类可以选择 lenient 或者选用其他的非 lenient。 默认情况下它是不使用 lenient的,这意味着它只接受兼容的 JSON 输入。 如果 JSON 违反了结构规则之一,则 JsonReader 和 Gson 将抛出异常。 但是,JsonReader 具有宽松的可选设置。 然后,也只有到那时,它才会兼容某些违规行为,并尝试最好甚至读取格式有问题的 JSON。

让我们引用一些非标准 JSON 元素的文档:

  • 以非执行前缀 “)]}'\n” 开头的流。
  • 包含多个顶级值的流。 使用严格的解析,每个流必须只包含一个顶级值。
  • 任何类型的顶级值。 使用严格解析,顶级值必须是对象或数组。
  • 数字可以是 NaN 或无穷大。
  • //# 开头并以换行符结尾的行尾注释。
  • /* 开头并以 */ 结尾的 C 样式注释。 此类注释可能不会嵌套。
  • 未加引号或“单引号”的名称。
  • 未加引号或“单引号”的字符串。
  • 数组元素用 ; 分隔 代替 ,
  • 不必要的数组分隔符。 这些被解释为好像 null 是省略的值。
  • 名称和值由 = 或 => 分隔,而不是 :。
  • 由 ; 分隔的名称/值对 代替 ,

所有这些对我们使用 Gson 有何影响? 从理论上讲,Gson(与 JsonReader 不同)在默认情况下已经很宽松了。 因此,如果我们的 JSON 不正确,通常我们不需要启用它。 不幸的是,Gson 在这个问题上的具体表现似乎有些混乱。 随着事情的发展,我们会为大家进行更新。

大家需要记住的是,在 JSON 反序列化方面,Gson 可以选择更加宽容。 如果要启用它,请使用 GsonBuilder:

GsonBuilder gsonBuilder = new GsonBuilder();  
gsonBuilder.setLenient();  
Gson gson = gsonBuilder.create();  

让你的 Gson 实例宽松可以帮助解决一些结构性问题。 然而,宽大的选项只能做这么多。 如果违规超出了我们在上面向大家展示的一个示例,Gson 将抛出 MalformedJsonException。 如果我们遇到其中之一,可能需要检查自己的 JSON 及其结构有效性。 几乎在所有情况下,问题的根源都是存在的。

我们建议使用 JSONLint 之类的工具来验证我们的 JSON。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Gson 通过@JsonAdapter 自定义(反)序列化

发布时间:2022/07/24 浏览次数:217 分类:编程语言

在这篇文章中,我们将展示如何简化(反)序列化的自定义。 所有这些选项都只能通过自定义 Gson 实例和一些样板代码获得。 Gson 2.7 引入了一个简单的注解,我们可以节省大量代码并获

Gson 自定义反序列化基础

发布时间:2022/07/21 浏览次数:81 分类:编程语言

在这篇文章中,我们将了解如何实现自定义 Gson 反序列化。 如果服务器以与客户端的应用程序数据模型不匹配的格式向我们发送数据,请继续阅读!

Gson 泛型映射

发布时间:2022/07/19 浏览次数:234 分类:编程语言

在这篇文章中,我们将探讨 Gson 如何处理 Java 泛型。 泛型对于任何数据映射库都是一个挑战,因为它们带来了不确定性。 如果我们想查看 Java 泛型、用例和含义,请随时阅读 Wikipedia 文

Gson 自定义实例创建器

发布时间:2022/07/14 浏览次数:121 分类:编程语言

在这篇文章中,我们将讨论自定义反序列化的另一个组件。 在过去的几篇文章中,我们探讨了如何自定义数据的序列化和反序列化。 在这两种情况下,我们都试图减轻服务器和客户端之

Gson 循环引用的映射

发布时间:2022/07/13 浏览次数:173 分类:编程语言

在这篇文章中,我们将讨论一个特别讨厌的话题:循环引用。 我们可能在计算机科学或图表数学课上听说过循环引用。 在更实际的解释中:它处理对象具有指向不同对象的嵌套属性的情

Gson Builder Floats 和 Doubles 的特殊值

发布时间:2022/07/12 浏览次数:193 分类:编程语言

在上一篇 Gson 的文章中,我们研究了使 JSON 转换降低标准的选项。 Lenient 允许传入的 JSON 在某种程度上是非标准的,Gson 仍然能够将其解析为 Java 对象。 在这篇文章中,我们将研究一个

Gson 自定义序列化

发布时间:2022/07/11 浏览次数:117 分类:编程语言

在这篇文章中,我们将探讨如何自定义 Java 对象的 Gson 序列化。 我们可能想要更改序列化的原因有很多,例如 简化我们的模型以减少发送的数据量或删除个人信息。 现在我们将通过实

Gson 映射 Enum 枚举

发布时间:2022/07/10 浏览次数:156 分类:编程语言

在之前的文章中我们介绍了如何映射嵌套对象、数组和列表、Java Map 等。 在这篇文章中,您将学习如何(反)序列化 Java 枚举 Enum。

Gson 如何反序列化多态对象列表

发布时间:2022/07/09 浏览次数:286 分类:编程语言

最近,我们遇到了一种情况,我从 REST 端点接收到 JSON 格式的对象列表。 到目前为止,这没有什么不寻常的,也不是问题。 然而,问题是对象是多态的,需要解析子类特定的字段。 以

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便