Gson 5 个常见错误和问题
在过去的多篇文章中,我们几乎向大家介绍了有关 Gson 的每一个小细节。 是时候退后一步,看看大局了。 在这篇文章中,我们将介绍在生产应用程序中使用 Gson 时会遇到的一些常见错误和问题。
1. Expecting an Object Instead of an Array
大多数 Gson 开发人员在反序列化数据时会在生命周期中的某个时刻看到如下的错误
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $。
它只是告诉我们 JSON 包含一个包含在 []
中的数组,并且我们的模型在该位置需要一个对象。 如果它是第 1 行且列号较低,则通常是整个模型,它应该是单个对象而不是 Java 数组。 如果它是更高的行,它可能是模型中的嵌套元素。
我们建议仔细查看 JSON 并将其与我们的 Java 模型进行比较。 我们还可以将 jsonschema2pojo
等工具的结果与我们的模型设置进行比较。 我们最终会发现错误的。
2. Expecting an Array Instead of an Object
翻转我们之前的示例也将是我们可能遇到的问题。 如果我们的模型描述了一个数组,但 JSON 包含一个包裹在 {}
中的对象,Gson 将抛出以下错误
java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $。
解决此问题的方法是相同的。 控制我们的 Java 模型设置和 JSON 以找出差异。 一旦两者具有相同的数据结构,Gson 将再次正常工作。
3. Not Re-Using Your Gson Instance
我们几乎所有的文章都包含这样的代码片段:
UserSimple userObject = new UserSimple("jiyik", "jiyik_onmpw@163.com", 26, true);
Gson gson = new Gson();
String userJson = gson.toJson(userObject);
优化性能的一种简单方法是跨类共享 Gson 实例。 我们不需要为每次转换都创建一个新的 Gson 实例。 我们可以将其声明为字段属性,并让编写的所有方法重新使用它。 这为我们的应用程序提供了一点额外的性能。
4. 不缩小序列化数据
作为开发人员,Gson 对我们非常友好。 它经常在没有任何额外配置的情况下对数据进行序列化和反序列化。 即使它开箱即用,也不要让它阻止我们对其进一步优化!
例如,在许多应用程序中,Java 模型比服务器实际预期的要复杂得多。 该应用程序将发送比服务器处理更多的数据。 这会消耗不必要的性能,因为 Gson 必须进行不必要的转换。
如果我们的应用程序通过 Internet 发送数据,它还会创建更大的字符串,从而使请求花费更长的时间并消耗用户的数据计划。
我们建议各位看官仔细检查自己发送的内容,如果可能,尽量减少应用的序列化数据。 我们关于排除策略 的博客文章应该为大家提供所有必要的知识。
5. 使用自定义 Setter
正如我们多次解释的那样,Gson 依赖于反射,不会使用我们的自定义 getter
和 setter
。 如果我们的模型类在其 setter
中有业务逻辑,我们会遇到一些问题:
public void setFirstName(String firstName) {
this.firstName = firstName;
updateFullName();
}
但是不用担心,我们已经在自定义反序列化器文章中向各位展示了如何在 setter
中使用逻辑。
在这篇文章中,我们了解了一些在使用 Gson 库时可能会导致问题的关键内容。 确保大家在开发阶段取得进展时了解它们。
相关文章
Gson 通过@JsonAdapter 自定义(反)序列化
发布时间:2022/07/24 浏览次数:213 分类:编程语言
-
在这篇文章中,我们将展示如何简化(反)序列化的自定义。 所有这些选项都只能通过自定义 Gson 实例和一些样板代码获得。 Gson 2.7 引入了一个简单的注解,我们可以节省大量代码并获
Gson 自定义反序列化基础
发布时间:2022/07/21 浏览次数:80 分类:编程语言
-
在这篇文章中,我们将了解如何实现自定义 Gson 反序列化。 如果服务器以与客户端的应用程序数据模型不匹配的格式向我们发送数据,请继续阅读!
Gson 自定义实例创建器
发布时间:2022/07/14 浏览次数:121 分类:编程语言
-
在这篇文章中,我们将讨论自定义反序列化的另一个组件。 在过去的几篇文章中,我们探讨了如何自定义数据的序列化和反序列化。 在这两种情况下,我们都试图减轻服务器和客户端之
Gson 循环引用的映射
发布时间:2022/07/13 浏览次数:168 分类:编程语言
-
在这篇文章中,我们将讨论一个特别讨厌的话题:循环引用。 我们可能在计算机科学或图表数学课上听说过循环引用。 在更实际的解释中:它处理对象具有指向不同对象的嵌套属性的情
Gson Builder Floats 和 Doubles 的特殊值
发布时间:2022/07/12 浏览次数:192 分类:编程语言
-
在上一篇 Gson 的文章中,我们研究了使 JSON 转换降低标准的选项。 Lenient 允许传入的 JSON 在某种程度上是非标准的,Gson 仍然能够将其解析为 Java 对象。 在这篇文章中,我们将研究一个
Gson 自定义序列化
发布时间:2022/07/11 浏览次数:115 分类:编程语言
-
在这篇文章中,我们将探讨如何自定义 Java 对象的 Gson 序列化。 我们可能想要更改序列化的原因有很多,例如 简化我们的模型以减少发送的数据量或删除个人信息。 现在我们将通过实
Gson 映射 Enum 枚举
发布时间:2022/07/10 浏览次数:149 分类:编程语言
-
在之前的文章中我们介绍了如何映射嵌套对象、数组和列表、Java Map 等。 在这篇文章中,您将学习如何(反)序列化 Java 枚举 Enum。
Gson 如何反序列化多态对象列表
发布时间:2022/07/09 浏览次数:280 分类:编程语言
-
最近,我们遇到了一种情况,我从 REST 端点接收到 JSON 格式的对象列表。 到目前为止,这没有什么不寻常的,也不是问题。 然而,问题是对象是多态的,需要解析子类特定的字段。 以