在Android中使用Gson进行@SerializedName注解的基本目的是什么?给我举几个不同的例子,我不明白使用它的主要目的。
@SerializedName
qpgpyjmq1#
Java类示例,
public class Person { @SerializedName("name") private String personName; @SerializedName("bd") private String birthDate; }
此类有两个字段,分别表示人员的姓名和出生日期。这些字段使用**@SerializedName注解进行注解。此注解的参数(值)是serialising和deserialising对象时使用的名称。例如,Java字段personName在JSON中表示为name**。JSON示例,
serialising
deserialising
{ "name":"chintan", "bd":"01-01-1990" }
whlutmcx2#
这里已经有了一些答案,但是我想补充的是,如果您使用ProGuard来混淆您的代码&不要在您的模型类中使用@SerializedName("name"),那么您的GSON将无法工作。您的变量名可能已从String name更改为String a,导致GSON解析中断,因为GSON将在json &中查找关键字a它将失败。通过指定@SerializedName,GSON将不会基于变量名在json中查找,而只会使用指定的@SerializedName。当然,您可以告诉proguard不要对模型进行模糊处理,但如果您希望对模型进行模糊处理,则必须指定@SerializedName
ProGuard
@SerializedName("name")
String name
String a
a
8gsdolmq3#
使用@SerializedName,您实际上是在告诉解析器何时从服务器接收回调,即Json格式的回调:
{ "name":"John Doe", }
将对象序列化或反序列化为而不是搜索名为的键时:“userName”,在Json响应中搜索“name”。
@SerializedName("name") var userName: String,
这很好,因为你可能有一个model,你希望它的成员被你喜欢的任何东西调用。
dzjeubhm4#
通过在类的顶部指定@Keep,可以指示Proguard不对数据类进行模糊处理。这既不会删除类,也不会对类进行模糊处理。如果字段名与用于它的Json关键字相似,则无需将@SerializedName显式添加到每个字段。
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 )
这里的name,id用于**@SerializedName中,因为它是后端键。但是我使用了userName**,userId来存储这些值。
5条答案
按热度按时间qpgpyjmq1#
Java类示例,
此类有两个字段,分别表示人员的姓名和出生日期。这些字段使用**@SerializedName注解进行注解。此注解的参数(值)是
serialising
和deserialising
对象时使用的名称。例如,Java字段personName在JSON中表示为name**。JSON示例,
whlutmcx2#
这里已经有了一些答案,但是我想补充的是,如果您使用
ProGuard
来混淆您的代码&不要在您的模型类中使用@SerializedName("name")
,那么您的GSON将无法工作。您的变量名可能已从String name
更改为String a
,导致GSON解析中断,因为GSON将在json &中查找关键字a
它将失败。通过指定
@SerializedName
,GSON将不会基于变量名在json中查找,而只会使用指定的@SerializedName
。当然,您可以告诉proguard不要对模型进行模糊处理,但如果您希望对模型进行模糊处理,则必须指定
@SerializedName
8gsdolmq3#
使用@SerializedName,您实际上是在告诉解析器何时从服务器接收回调,即Json格式的回调:
将对象序列化或反序列化为而不是搜索名为的键时:“userName”,在Json响应中搜索“name”。
这很好,因为你可能有一个model,你希望它的成员被你喜欢的任何东西调用。
dzjeubhm4#
通过在类的顶部指定@Keep,可以指示Proguard不对数据类进行模糊处理。这既不会删除类,也不会对类进行模糊处理。如果字段名与用于它的Json关键字相似,则无需将@SerializedName显式添加到每个字段。
gudnpqoy5#
假设在一个真实的场景中,您的后端开发人员对您发出的API请求做出如下响应
现在,在您为处理此问题而创建的数据类中,您可能希望在Android端为从后端获取的字段“name”和“id”指定不同的变量名。
@SerializedName来这里救场。
您只需要在**@SerializedName**中指定将从后端获取的实际键值(将用于序列化和反序列化),然后您可以使用您选择的变量名来存储从操作中接收的值。
例如,对于我前面提到的JSON,其数据类如下所示:
这里的name,id用于**@SerializedName中,因为它是后端键。但是我使用了userName**,userId来存储这些值。