原文: https://howtodoinjava.com/gson/gson-serializedname/

在此 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"

  1. public class Employee
  2. {
  3. private Integer id;
  4. private String firstName;
  5. private String lastName;
  6. @SerializedName(value = "emailId", alternate = "emailAddress")
  7. private String email;
  8. }

让我们序列化一个员工记录并查看 JSON 输出。

  1. Employee emp = new Employee(1001, "Lokesh", "Gupta", "howtodoinjava@gmail.com");
  2. Gson gson = new GsonBuilder().setPrettyPrinting().create();
  3. System.out.println(gson.toJson(emp));

程序输出。

  1. {
  2. "id": 1001,
  3. "firstName": "Lokesh",
  4. "lastName": "Gupta",
  5. "emailId": "howtodoinjava@gmail.com"
  6. }

3.在反序列化期间更改字段名称

Java 程序,用于在将 JSON 反序列化为 Java 类的过程中映射不同的字段名称。

  1. {
  2. "id": 1001,
  3. "firstName": "Lokesh",
  4. "lastName": "Gupta",
  5. "email": "howtodoinjava@gmail.com",
  6. "emailAddress": "admin@gmail.com"
  7. }
  1. String json = "{'id': 1001,"
  2. + "'firstName': 'Lokesh',"
  3. + "'lastName': 'Gupta',"
  4. + "'email': 'howtodoinjava@gmail.com',"
  5. + "'emailAddress': 'admin@gmail.com'}";
  6. Gson gson = new GsonBuilder().setPrettyPrinting().create();
  7. Employee emp = gson.fromJson(json, Employee.class);
  8. System.out.println(emp);

程序输出:

  1. Employee [id=1001, firstName=Lokesh, lastName=Gupta, email=admin@gmail.com]

注意程序输出。 我们在电子邮件字段(即emailemailAddress)中有两个匹配项。 最后一次出现是"emailAddress",因此它的值已填充到Employee对象中。

让我问一下有关使用 Gson @SerializedName注解将多个不同名称映射到 Java 类中的成员字段的问题。

学习愉快!