迹忆客 专注技术分享

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

Gson Builder Floats 和 Doubles 的特殊值

作者:迹忆客 最近更新:2022/10/12 浏览次数:

在上一篇 Gson 的文章中,我们研究了使 JSON 转换降低标准的选项。 Lenient 允许传入的 JSON 在某种程度上是非标准的,Gson 仍然能够将其解析为 Java 对象。 在这篇文章中,我们将研究一个允许非标准输入的案例:Floats 和 Doubles 的特殊值(如 Float.NEGATIVE_INFINITY)。


Floats 和 Doubles 的特殊值

在 Java 中,需要用 float 和 double 值来表达一些边缘情况。 因此,Float.NEGATIVE_INFINITYFloat.POSITIVE_INFINITYFloat.NaN 的常量以及它们的双重对应物从一开始就在 Java 语言中。 不幸的是,JSON 规范没有看到这些边缘值的价值,也没有将其作为规范的一部分。

让我们在这个问题上引用 Gson 文档:

JSON 规范的第 2.4 节不允许特殊的双精度值(NaN、Infinity、-Infinity)。 但是,Javascript 规范(参见第 4.3.20、4.3.22、4.3.23 节)允许这些值作为有效的 Javascript 值。 此外,大多数 JavaScript 引擎将毫无问题地接受 JSON 中的这些特殊值。 因此,在实际层面上,接受这些值作为有效的 JSON 是有意义的,即使 JSON 规范不允许它们。

还记得在上一篇文章中我们写道,当谈到 JSON 标准时,Gson 在反序列化期间非常灵活,而在序列化期间非常严格? 第一部分仍然正确,但是这个Floats/Doubles特殊值主题是 Gson 可以故意违反标准的唯一例外。

让我们明确一点:如果传入的 JSON 使用这些特殊的 Floats/Doubles 值中的一个或多个,默认情况下会反序列化它而不会出现任何问题。

如果我们将 Float.POSITIVE_INFINITY 作为值传递,Gson 将抛出异常,因为它无法转换它并且符合标准。 如果我们需要传递这些值,则需要专门启用那些使用 GsonBuilder 的转换。 Gson 提供了方法 serializeSpecialFloatingPointValues() 来做到这一点。

是时候看一个例子了。 我们创建了一个用户类,它还存储了一个描述权重的 Float 值。

public class UserFloat {  
    String name;
    Float weight;

    public UserFloat(String name, Float weight) {
        this.name = name;
        this.weight = weight;
    }
}

现在,由于节日的美食对我产生了负面影响,而且我最近体重增加了很多,所以我需要像这样创建我的用户实例:

UserFloat user = new UserFloat("jiyik", Float.POSITIVE_INFINITY);  

如果我们把它传递给 Gson,它会抛出一个异常:

Gson gson = new Gson();

UserFloat user = new UserFloat("jiyik", Float.POSITIVE_INFINITY);

String usersJson = gson.toJson(user); // 这里将会抛出异常  

Gson 会给我们抛出一个 IllegalArgumentException 异常,它会声明

根据 JSON 规范,无穷大不是有效的双精度值。 要覆盖此行为,请使用 GsonBuilder.serializeSpecialFloatingPointValues() 方法。

异常消息很有帮助,并且已经将我们推荐了解决方案。 我们需要使用 GsonBuilder:

Float.POSITIVE_INFINITY

这将毫无例外地创建一个 usersJson 和正确的内容:

GsonBuilder

当然,由于这不是 100% 标准,我们需要确保我们自己的 API 可以处理这些异常值。

转载请发邮件至 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 自定义序列化

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

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

Gson 映射 Enum 枚举

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

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

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

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

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

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

发布时间:2022/06/26 浏览次数:100 分类:编程语言

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

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便