在此 Gson @SerializedName
示例中,学习在序列化和反序列化过程中,如何更改 json 和 java 对象之间的字段名称。
1. @SerializedName
默认情况下,我们假设 Java 模型类和 JSON 将具有完全相同的字段名称。 但有时情况并非如此,某些名称有所不同。 现在我们必须将 json 中的someName
映射到 Java 类中的someOtherName
。 这是@SerializedName
注解提供帮助的地方。
@SerializedName
注解指示应将带注解的成员序列化为 JSON,并使用提供的名称值作为其字段名称。 此注解将覆盖可能已经使用GsonBuilder
类的所有FieldNamingPolicy
,包括默认字段命名策略。
请注意,您在此注解中指定的值必须是有效的 JSON 字段名称。
1.1 注解属性
它接受两个属性:
value
– 序列化或反序列化时所需的字段名称。alternate
– 反序列化字段时的备用名称。 除了value
属性以外,它还提供更多可能的名称。 如果有多个字段匹配一个属性,则 Gson 将使用最后处理的那个。
请记住,具有多个名称的
alternate
选项仅限于反序列化。 在序列化中,不会有任何影响。
2.在序列化期间更改字段名称
让我们以仅具有 4 个字段的Employee
类为例。 我们要创建 JSON,其中"email"
被写为字段名"emailId"
。
public class Employee
{
private Integer id;
private String firstName;
private String lastName;
@SerializedName(value = "emailId", alternate = "emailAddress")
private String email;
}
让我们序列化一个员工记录并查看 JSON 输出。
Employee emp = new Employee(1001, "Lokesh", "Gupta", "howtodoinjava@gmail.com");
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println(gson.toJson(emp));
程序输出。
{
"id": 1001,
"firstName": "Lokesh",
"lastName": "Gupta",
"emailId": "howtodoinjava@gmail.com"
}
3.在反序列化期间更改字段名称
Java 程序,用于在将 JSON 反序列化为 Java 类的过程中映射不同的字段名称。
{
"id": 1001,
"firstName": "Lokesh",
"lastName": "Gupta",
"email": "howtodoinjava@gmail.com",
"emailAddress": "admin@gmail.com"
}
String json = "{'id': 1001,"
+ "'firstName': 'Lokesh',"
+ "'lastName': 'Gupta',"
+ "'email': 'howtodoinjava@gmail.com',"
+ "'emailAddress': 'admin@gmail.com'}";
Gson gson = new GsonBuilder().setPrettyPrinting().create();
Employee emp = gson.fromJson(json, Employee.class);
System.out.println(emp);
程序输出:
Employee [id=1001, firstName=Lokesh, lastName=Gupta, email=admin@gmail.com]
注意程序输出。 我们在电子邮件字段(即email
和emailAddress
)中有两个匹配项。 最后一次出现是"emailAddress"
,因此它的值已填充到Employee
对象中。
让我问一下有关使用 Gson @SerializedName
注解将多个不同名称映射到 Java 类中的成员字段的问题。
学习愉快!