Gson – GsonBuilder配置示例

Gson – GsonBuilder配置示例

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

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

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

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

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

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

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

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

2. FieldNamingPolicy

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

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

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

public class User 
{
	private long id;
	private String first_Name;
	private String lastName;
	private String _email;
}

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 一起使用此命名策略将确保字段名称不变。 这是默认行为。

{
  "id": 1,
  "first_Name": "Lokesh",
  "lastName": "Gupta",
  "_email": "admin@howtodoinjava.com"
}

2.2 FieldNamingPolicy.LOWER_CASE_WITH_DASHES

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

{
  "id": 1,
  "first_-name": "Lokesh",
  "last-name": "Gupta",
  "_email": "admin@howtodoinjava.com"
}

2.3 FieldNamingPolicy.LOWER_CASE_WITH_DOTS

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

{
  "id": 1,
  "first_.name": "Lokesh",
  "last.name": "Gupta",
  "_email": "admin@howtodoinjava.com"
}

2.4 FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES

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

{
  "id": 1,
  "first__name": "Lokesh",
  "last_name": "Gupta",
  "_email": "admin@howtodoinjava.com"
}

2.5 FieldNamingPolicy.UPPER_CAMEL_CASE

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

{
  "Id": 1,
  "First_Name": "Lokesh",
  "LastName": "Gupta",
  "_Email": "admin@howtodoinjava.com"
}

2.6 FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES

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

{
  "Id": 1,
  "First_ Name": "Lokesh",
  "Last Name": "Gupta",
  "_Email": "admin@howtodoinjava.com"
}

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

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

Employee employeeObj = new Employee(1, "Lokesh", "Gupta", null);

Gson gson = new GsonBuilder()
		.serializeNulls()
		.setPrettyPrinting().create(); 

System.out.println(gson.toJson(employeeObj));

程序输出。

{
  "id": 1,
  "firstName": "Lokesh",
  "lastName": "Gupta",
  "emailId": null
}

4. GsonBuilder.setExclusionStrategies()

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

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

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

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

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

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。

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

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

学习愉快!