原文: https://howtodoinjava.com/gson/gson-gsonbuilder-configuration/

对于简单的用例,使用Gson gson = new Gson();及其标准配置就足够了。 但是,如果您打算自定义 Gson 的行为,则可以使用 GsonBuilder通过自定义配置创建新的 Gson 实例。

GsonBuilder类提供.create()方法,该方法返回Gson实例。

  1. Gson gson = new GsonBuilder().create();

1. GsonBuilder.setPrettyPrinting() – 精美打印 JSON

默认情况下,Gson 将创建缩小的 JSON 字符串。 这对于减少通过网络传输的数据量非常重要。

但是,这种缩小的 JSON 对开发人员进行开发/调试应用时无济于事。 使用精美打印来格式化 JSON 输出。

  1. Gson gson = new GsonBuilder()
  2. .setPrettyPrinting()
  3. .create();

2. FieldNamingPolicy

FieldNamingPolicy 枚举在序列化期间为 JSON 字段名称提供了几种标准命名约定。 它有助于Gson实例将 Java 字段名称正确转换为所需的 JSON 字段名称。

注意:请注意,以下任何命名约定均不会影响用@SerializedName注解的字段。

以下命名选项可用。 我们将验证使用User类的每个策略生成的名称。 为了示例目的,我们以不同的模式添加了字段名称,以便我们可以了解每种命名策略如何在不同策略下转换不同的名称。

  1. public class User
  2. {
  3. private long id;
  4. private String first_Name;
  5. private String lastName;
  6. private String _email;
  7. }
  1. User user = new User(1, "Lokesh", "Gupta", "admin@howtodoinjava.com");
  2. Gson gson = new GsonBuilder()
  3. .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY)
  4. .setPrettyPrinting().create();
  5. System.out.println(gson.toJson(user));

2.1 FieldNamingPolicy.IDENTITY

与 Gson 一起使用此命名策略将确保字段名称不变。 这是默认行为。

  1. {
  2. "id": 1,
  3. "first_Name": "Lokesh",
  4. "lastName": "Gupta",
  5. "_email": "admin@howtodoinjava.com"
  6. }

2.2 FieldNamingPolicy.LOWER_CASE_WITH_DASHES

Gson 会将 Java 字段名称从其驼峰大小写形式修改为小写的字段名称,其中每个单词都用破折号(-)分隔。

  1. {
  2. "id": 1,
  3. "first_-name": "Lokesh",
  4. "last-name": "Gupta",
  5. "_email": "admin@howtodoinjava.com"
  6. }

2.3 FieldNamingPolicy.LOWER_CASE_WITH_DOTS

Gson 会将 Java 字段名称从其驼峰大小写形式修改为小写的字段名称,其中每个单词都用点(.)分隔。

  1. {
  2. "id": 1,
  3. "first_.name": "Lokesh",
  4. "last.name": "Gupta",
  5. "_email": "admin@howtodoinjava.com"
  6. }

2.4 FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES

Gson 会将 Java 字段名称从其驼峰大小写形式修改为小写的字段名称,其中每个单词都用下划线(_)分隔。

  1. {
  2. "id": 1,
  3. "first__name": "Lokesh",
  4. "last_name": "Gupta",
  5. "_email": "admin@howtodoinjava.com"
  6. }

2.5 FieldNamingPolicy.UPPER_CAMEL_CASE

Gson 将确保序列化为 JSON 格式的 Java 字段名称的第一个“字母”大写。

  1. {
  2. "Id": 1,
  3. "First_Name": "Lokesh",
  4. "LastName": "Gupta",
  5. "_Email": "admin@howtodoinjava.com"
  6. }

2.6 FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES

Gson 将确保在将 Java 字段名称的第一个“字母”序列化为 JSON 格式时将其大写,并且单词之间将使用空格分隔。

  1. {
  2. "Id": 1,
  3. "First_ Name": "Lokesh",
  4. "Last Name": "Gupta",
  5. "_Email": "admin@howtodoinjava.com"
  6. }

3. GsonBuilder.serializeNulls() – 空值的序列化

默认情况下,Gson 在序列化过程中会忽略null属性。 但是,有时我们想序列化具有空值的字段,以便它必须出现在 JSON 中。 为此,请使用serializeNulls()方法。

  1. Employee employeeObj = new Employee(1, "Lokesh", "Gupta", null);
  2. Gson gson = new GsonBuilder()
  3. .serializeNulls()
  4. .setPrettyPrinting().create();
  5. System.out.println(gson.toJson(employeeObj));

程序输出。

  1. {
  2. "id": 1,
  3. "firstName": "Lokesh",
  4. "lastName": "Gupta",
  5. "emailId": null
  6. }

4. GsonBuilder.setExclusionStrategies()

ExclusionStrategy用于确定是否应序列化或反序列化字段或顶级类作为 JSON 输出/输入的一部分。

对于序列化,如果shouldSkipClass(Class)方法返回true,则该类或字段类型将不属于 JSON 输出。

对于反序列化,如果shouldSkipClass(Class)返回true,则不会将其设置为 Java 对象结构的一部分。

相同的规则应用于shouldSkipField(attribute)方法。

在下面的示例中,将从序列化和反序列化中排除带有@NPI注解和所有Account类实例的 Gson 成员字段。

  1. Gson gson = new GsonBuilder()
  2. .setExclusionStrategies(new ExclusionStrategy() {
  3. @Override
  4. public boolean shouldSkipField(FieldAttributes f) {
  5. return f.getAnnotation(NPI.class) != null;
  6. }
  7. @Override
  8. public boolean shouldSkipClass(Class<?> clazz) {
  9. return clazz.getAnnotation(Account.class) != null;
  10. }
  11. })
  12. .setPrettyPrinting()
  13. .create();

5. GsonBuilder.setLenient() – 宽松的 JSON 语法规则

在反序列化期间,Gson 使用了一个不太宽大的JsonReader类。 这意味着它仅接受兼容的 JSON 输入。 如果 JSON 违反结构规则之一,它将抛出MalformedJsonException

如果我们将lenient设置为true,它将吞噬某些违规行为,并尝试最好甚至读取格式较差的 JSON。

  1. Gson gson = new GsonBuilder()
  2. .setLenient()
  3. .setPrettyPrinting().create();

这些是一些最常用的GsonBuilder配置方法及其用法。 将您的问题留在我的评论中。

学习愉快!