原文: 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
配置方法及其用法。 将您的问题留在我的评论中。
学习愉快!