原文: 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() {@Overridepublic boolean shouldSkipField(FieldAttributes f) {return f.getAnnotation(NPI.class) != null;}@Overridepublic 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配置方法及其用法。 将您的问题留在我的评论中。
学习愉快!
