在Android中使用Gson的@SerializedName注解的基本用途是什么

vktxenjb  于 2022-11-06  发布在  Android
关注(0)|答案(5)|浏览(177)

在Android中使用Gson进行@SerializedName注解的基本目的是什么?
给我举几个不同的例子,我不明白使用它的主要目的。

qpgpyjmq

qpgpyjmq1#

Java类示例,

public class Person {

    @SerializedName("name")
    private String personName;

    @SerializedName("bd")
    private String birthDate;

}

此类有两个字段,分别表示人员的姓名和出生日期。这些字段使用**@SerializedName注解进行注解。此注解的参数(值)是serialisingdeserialising对象时使用的名称。例如,Java字段personName在JSON中表示为name**。
JSON示例,

{
    "name":"chintan",
    "bd":"01-01-1990"
}
whlutmcx

whlutmcx2#

这里已经有了一些答案,但是我想补充的是,如果您使用ProGuard来混淆您的代码&不要在您的模型类中使用@SerializedName("name"),那么您的GSON将无法工作。您的变量名可能已从String name更改为String a,导致GSON解析中断,因为GSON将在json &中查找关键字a它将失败。
通过指定@SerializedName,GSON将不会基于变量名在json中查找,而只会使用指定的@SerializedName
当然,您可以告诉proguard不要对模型进行模糊处理,但如果您希望对模型进行模糊处理,则必须指定@SerializedName

8gsdolmq

8gsdolmq3#

使用@SerializedName,您实际上是在告诉解析器何时从服务器接收回调,即Json格式的回调:

{
    "name":"John Doe",
}

将对象序列化反序列化而不是搜索名为的键时:“userName”,在Json响应中搜索“name”。

@SerializedName("name")
var userName: String,

这很好,因为你可能有一个model,你希望它的成员被你喜欢的任何东西调用。

dzjeubhm

dzjeubhm4#

通过在类的顶部指定@Keep,可以指示Proguard不对数据类进行模糊处理。这既不会删除类,也不会对类进行模糊处理。如果字段名与用于它的Json关键字相似,则无需将@SerializedName显式添加到每个字段。

gudnpqoy

gudnpqoy5#

假设在一个真实的场景中,您的后端开发人员对您发出的API请求做出如下响应

{
 "name":"John Doe",
 "id":"1478"
}

现在,在您为处理此问题而创建的数据类中,您可能希望在Android端为从后端获取的字段“name”和“id”指定不同的变量名。

@SerializedName来这里救场。

您只需要在**@SerializedName**中指定将从后端获取的实际键值(将用于序列化和反序列化),然后您可以使用您选择的变量名来存储从操作中接收的值。
例如,对于我前面提到的JSON,其数据类如下所示:

data class User(
    @SerializedName("name") val userName: String,
    @SerializedName("id") val userId: Int
)

这里的nameid用于**@SerializedName中,因为它是后端键。但是我使用了userName**,userId来存储这些值。

相关问题