Gson 模型注解——带有 @SerializedName 的多个反序列化名称
在之前的 Gson 博客文章中,我们介绍了使用 @SerializedName 更改模型属性的(反)序列化命名 。 如果服务器需要(或发送)具有不同名称的属性,我们可以使用 @SerializedName
来解决差异。
在这篇文章中,我们将向大家展示如何将多个名称映射到一个属性。 如果我们的应用程序与多个 API 交互,这将非常有用,这些 API 用不同的名称描述相同的事物。 我们仍然可以使用一个 Java 类作为模型!
扩展模型注解 @SerializedName
在第一篇 @SerializedName
的文章中,我们向大家展示了以下用法:、
public class UserSimple {
@SerializedName("fullName")
String name;
String email;
boolean isDeveloper;
int age;
}
我们将注解添加到模型属性并将序列化和反序列化的名称作为字符串传递。
但这还不是全部! SerializedName 接受两个参数:value
和 alternate
。 前者是默认参数。 如果只传递一个字符串,它将设置该值并将 alternate
保留为空值。 但是我们可以专门指定这两个参数:
public class UserSimpleSerializedName {
@SerializedName(value = "fullName", alternate = "username")
private String name;
private String email;
private boolean isDeveloper;
private int age;
}
再一次,值改变了默认序列化和默认反序列化! 因此,如果 Gson 从 Java 模型类创建 JSON,它将使用该值作为名称。
alternate 仅在反序列化期间用作附加选项。 Gson 将检查我们指定的所有名称的 JSON,并尝试找到一个将其映射到带注解的属性。 对于上面的模型类,Gson 会检查传入的 JSON 是否有 fullName 或 username 字段。 任何一个都将映射到 name 属性:
{
'fullName': 'jiyik',
'email': 'jiyik_onmpw@163.com'
}
{
'username': 'jiyik',
'email': 'jiyik_onmpw@163.com'
}
上面两种 JSON 都会产生相同的 Java 对象。
如果有多个字段匹配一个属性,Gson 将使用最后出现的那个进行映射。 例如,在以下 JSON 中,name 属性将设置为 onmpw,因为该值是后出现的:
{
'username': 'jiyik',
'fullName': 'onmpw',
'email': 'norman@futurestud.io'
}
如果我们的服务器创建不一致的 JSON,则我们永远不知道映射了哪个属性。
总结
在这篇文章中,我们了解了如何进一步利用 @SerializedName
来处理单个属性的多个名称。
请记住,这仅限于反序列化。 Gson 会将各种 JSON 值映射到 Java 对象,但在序列化期间始终创建相同的 JSON。
相关文章
Gson 通过@JsonAdapter 自定义(反)序列化
发布时间:2022/07/24 浏览次数:217 分类:编程语言
-
在这篇文章中,我们将展示如何简化(反)序列化的自定义。 所有这些选项都只能通过自定义 Gson 实例和一些样板代码获得。 Gson 2.7 引入了一个简单的注解,我们可以节省大量代码并获
Gson 自定义反序列化基础
发布时间:2022/07/21 浏览次数:81 分类:编程语言
-
在这篇文章中,我们将了解如何实现自定义 Gson 反序列化。 如果服务器以与客户端的应用程序数据模型不匹配的格式向我们发送数据,请继续阅读!
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 格式的对象列表。 到目前为止,这没有什么不寻常的,也不是问题。 然而,问题是对象是多态的,需要解析子类特定的字段。 以