# 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`配置方法及其用法。 将您的问题留在我的评论中。

学习愉快！