💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# Gson – `GsonBuilder`配置示例 > 原文: [https://howtodoinjava.com/gson/gson-gsonbuilder-configuration/](https://howtodoinjava.com/gson/gson-gsonbuilder-configuration/) 对于简单的用例,使用`Gson gson = new Gson();`及其标准配置就足够了。 但是,如果您打算自定义 [Gson](https://howtodoinjava.com/library/google-gson-tutorial/) 的行为,则可以使用 `GsonBuilder`通过自定义配置创建新的 Gson 实例。 [`GsonBuilder`](https://static.javadoc.io/com.google.code.gson/gson/2.8.5/com/google/gson/GsonBuilder.html)类提供`.create()`方法,该方法返回`Gson`实例。 ```java Gson gson = new GsonBuilder().create(); ``` ## 1\. `GsonBuilder.setPrettyPrinting()` – 精美打印 JSON 默认情况下,Gson 将创建缩小的 JSON 字符串。 这对于减少通过网络传输的数据量非常重要。 但是,这种缩小的 JSON 对开发人员进行开发/调试应用时无济于事。 使用精美打印来格式化 JSON 输出。 ```java Gson gson = new GsonBuilder() .setPrettyPrinting() .create(); ``` ## 2\. `FieldNamingPolicy` [`FieldNamingPolicy`](https://static.javadoc.io/com.google.code.gson/gson/2.8.5/com/google/gson/FieldNamingPolicy.html) 枚举在序列化期间为 JSON 字段名称提供了几种标准命名约定。 它有助于`Gson`实例将 Java 字段名称正确转换为所需的 JSON 字段名称。 *注意:请注意,以下任何命名约定均不会影响用`@SerializedName`注解的字段。* 以下命名选项可用。 我们将验证使用`User`类的每个策略生成的名称。 为了示例目的,我们以不同的模式添加了字段名称,以便我们可以了解每种命名策略如何在不同策略下转换不同的名称。 ```java public class User { private long id; private String first_Name; private String lastName; private String _email; } ``` ```java User user = new User(1, "Lokesh", "Gupta", "admin@howtodoinjava.com"); Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY) .setPrettyPrinting().create(); System.out.println(gson.toJson(user)); ``` #### 2.1 `FieldNamingPolicy.IDENTITY` 与 Gson 一起使用此命名策略将确保字段名称不变。 这是默认行为。 ```java { "id": 1, "first_Name": "Lokesh", "lastName": "Gupta", "_email": "admin@howtodoinjava.com" } ``` #### 2.2 `FieldNamingPolicy.LOWER_CASE_WITH_DASHES` Gson 会将 Java 字段名称从其驼峰大小写形式修改为小写的字段名称,其中每个单词都用破折号(`-`)分隔。 ```java { "id": 1, "first_-name": "Lokesh", "last-name": "Gupta", "_email": "admin@howtodoinjava.com" } ``` #### 2.3 `FieldNamingPolicy.LOWER_CASE_WITH_DOTS` Gson 会将 Java 字段名称从其驼峰大小写形式修改为小写的字段名称,其中每个单词都用点(`.`)分隔。 ```java { "id": 1, "first_.name": "Lokesh", "last.name": "Gupta", "_email": "admin@howtodoinjava.com" } ``` #### 2.4 `FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES` Gson 会将 Java 字段名称从其驼峰大小写形式修改为小写的字段名称,其中每个单词都用下划线(`_`)分隔。 ```java { "id": 1, "first__name": "Lokesh", "last_name": "Gupta", "_email": "admin@howtodoinjava.com" } ``` #### 2.5 `FieldNamingPolicy.UPPER_CAMEL_CASE` Gson 将确保序列化为 JSON 格式的 Java 字段名称的第一个“字母”大写。 ```java { "Id": 1, "First_Name": "Lokesh", "LastName": "Gupta", "_Email": "admin@howtodoinjava.com" } ``` #### 2.6 `FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES` Gson 将确保在将 Java 字段名称的第一个“字母”序列化为 JSON 格式时将其大写,并且单词之间将使用空格分隔。 ```java { "Id": 1, "First_ Name": "Lokesh", "Last Name": "Gupta", "_Email": "admin@howtodoinjava.com" } ``` ## 3\. `GsonBuilder.serializeNulls()` – 空值的序列化 默认情况下,Gson 在序列化过程中会忽略`null`属性。 但是,有时我们想序列化具有空值的字段,以便它必须出现在 JSON 中。 为此,请使用`serializeNulls()`方法。 ```java Employee employeeObj = new Employee(1, "Lokesh", "Gupta", null); Gson gson = new GsonBuilder() .serializeNulls() .setPrettyPrinting().create(); System.out.println(gson.toJson(employeeObj)); ``` 程序输出。 ```java { "id": 1, "firstName": "Lokesh", "lastName": "Gupta", "emailId": null } ``` ## 4\. `GsonBuilder.setExclusionStrategies()` [**`ExclusionStrategy`**](https://static.javadoc.io/com.google.code.gson/gson/2.8.2/com/google/gson/ExclusionStrategy.html)用于确定是否应序列化或反序列化字段或顶级类作为 JSON 输出/输入的一部分。 对于序列化,如果`shouldSkipClass(Class)`方法返回`true`,则该类或字段类型将不属于 JSON 输出。 对于反序列化,如果`shouldSkipClass(Class)`返回`true`,则不会将其设置为 Java 对象结构的一部分。 相同的规则应用于`shouldSkipField(attribute)`方法。 在下面的示例中,将从序列化和反序列化中排除带有`@NPI`注解和所有`Account`类实例的 Gson 成员字段。 ```java Gson gson = new GsonBuilder() .setExclusionStrategies(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { return f.getAnnotation(NPI.class) != null; } @Override public boolean shouldSkipClass(Class<?> clazz) { return clazz.getAnnotation(Account.class) != null; } }) .setPrettyPrinting() .create(); ``` ## 5\. `GsonBuilder.setLenient()` – 宽松的 JSON 语法规则 在反序列化期间,Gson 使用了一个不太宽大的`JsonReader`类。 这意味着它仅接受兼容的 JSON 输入。 如果 JSON 违反结构规则之一,它将抛出`MalformedJsonException`。 如果我们将`lenient`设置为`true`,它将吞噬某些违规行为,并尝试最好甚至读取格式较差的 JSON。 ```java Gson gson = new GsonBuilder() .setLenient() .setPrettyPrinting().create(); ``` 这些是一些最常用的`GsonBuilder`配置方法及其用法。 将您的问题留在我的评论中。 学习愉快!