当前位置:   article > 正文

Google Gson 快速使用入门,Spring boot 切换为 Gson_com.google.code.gson

com.google.code.gson

目录

Gson 概述与下载

Gson (反)序列化 Java 对象

JsonElement  Json 元素

JsonObject Json 对象

JsonArray Json 数组

JsonParser Json 解析

GsonBuilder 构建 Gson

Spring Boot 使用 Gson 替换 Jackson


Gson 概述与下载

1、Java 解析 Json 最常用的类库有:google 的 Gson阿里巴巴的 FastJson、以及 Jackson。这些都是非常优秀而且常用的库。

2、GSON 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库,可以快速的将一个 Json 字符转成一个 Java 对象,或者将一个 Java 对象转化为 Json 字符串。

3、gson 在 github 上开源地址:https://github.com/google/gson

4、注意事项:Gson 将 Map 序列化为 Json 字符串时,默认原本的整型会加上 .0 而变成浮点型,比如 0 -> 0.0,1 -> 1.0 。​​​​​​​

二进制开发包下载:gson 二进制开发包下载地址:Maven Central Repository Search

 gson-2.8.4.jar下载gson-2.8.5.jar下载

Maven 依赖:gson 在 Maven 仓库地址:https://mvnrepository.com/artifact/com.google.code.gson/gson

  1. <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
  2. <dependency>
  3.   <groupId>com.google.code.gson</groupId>
  4.   <artifactId>gson</artifactId>
  5.   <version>2.8.5</version>
  6. </dependency>

Gson (反)序列化 Java 对象

1、com.google.gson.Gson 提供 toJson() 和 fromJson() 方法用于序列化与反序列化  Java 对象。

2、Gson 对象的 toJson 方法可以将 Java 基本数据类型、数组、以及 POJO 对象、List、Map 、JsonElement  等转为 json 格式的字符串,

3、Gson 对象的 fromJson 方法做与 toJson 相反的操作,将 json 格式的字符串转为基本数据类型、 POJO 对象、List、Map 、JsonElement  等

对象序列化
 T fromJson(String json, Class<T> classOfT)将指定的 Json 反序列化为指定类的对象,如果指定的类是泛型类型,则使用 fromJson(String, Type)方法。
T fromJson(String json, Type typeOfT)将指定的 Json 反序列化为指定类型的对象,如果指定的对象是泛型类型,则此方法很有用,对于非泛型对象,请改用 fromJson(String json, Class<T> classOfT)
T fromJson(JsonElement json, Class<T> classOfT)将指定的 json 元素反序列化为指定类型的对象,如果指定的类是泛型类型,则使用 fromJson(JsonElement, Type) 方法。
T fromJson(JsonElement json, Type typeOfT)
T fromJson(Reader json, Class<T> classOfT)
T fromJson(Reader json, Type typeOfT)
将从指定字符输入流读取的Json反序列化为指定类的对象,如果指定的类是泛型类型,则调用 {@link#fromJson(Reader,type)}
序列化为对象
String toJson(Object src)将指定的对象序列化为其等效的Json表示形式,当指定的对象不是泛型类型时,应使用此方法,如果对象是泛型类型,请改用 toJson(object,type).
String toJson(Object src, Type typeOfSrc)将指定的对象(包括泛型类型的对象)序列化为其等效的Json表示形式,对于非泛型对象,请改用{@link#toJson(Object)}
String toJson(JsonElement jsonElement)将 JsonElement 转换为其等效的JSON表示形式。
JsonElement toJsonTree(Object src)将指定的对象序列化为 JsonElement 的等效表示形式,当指定的对象不是泛型类型时,应使用此方法;如果对象是泛型类型,请改用{@link#toJsonTree(object,type)}
JsonElement toJsonTree(Object src, Type typeOfSrc)

API 演示源码:src/main/java/com/wmx/gson/GsonTest.java · 汪少棠/apache-study - Gitee.com

JsonElement  Json 元素

1、JsonObject、JsonArray、JsonPrimitive、JsonNull 都是 JsonElement 的子类,JsonElement  常用方法:

JsonElement deepCopy()返回此元素的深层副本,克隆。
 BigDecimal getAsBigDecimal()将此元素作为 BigDecimal 类型获取,如果元素不是 JsonPrimitive,则引发 ClassCastException,
如果元素不是有效的 BigDecimate,则 @throws NumberFormatException。
如果元素属于 JsonArray 类型,但包含多个元素,则引发 IllegalStateException。
BigInteger getAsBigInteger()将此元素作为 BigInteger  类型获取,如果元素不是 JsonPrimitive,则引发 ClassCastException,
如果元素不是有效的 BigInteger ,则 @throws NumberFormatException。
如果元素属于 JsonArray 类型,但包含多个元素,则引发 IllegalStateException。
boolean getAsBoolean()将此元素作为原始布尔值获取,如果元素不是 JsonPrimitive 并且不是有效的布尔值,则引发 ClassCastException,
如果元素属于 JsonArray 类型,但包含多个元素,则引发IllegalStateException
byte getAsByte()将此元素作为原始 byte  值获取,如果元素不是 JsonPrimitive 并且不是有效的布尔值,则引发 ClassCastException,
如果元素属于 JsonArray 类型,但包含多个元素,则引发IllegalStateException

其它 Java 基本数据类型也是同理:

double getAsDouble()、char getAsCharacter()、float getAsFloat()、int getAsInt()、long getAsLong()、short getAsShort()

JsonArray getAsJsonArray()将此元素作为 JsonArray 获取,如果元素是其他类型的元素,则会生成 IlleglastateException 异常,
因此最好先调用 isJsonArray() 方法确保该元素是所需的类型,然后再使用此方法。
JsonObject getAsJsonObject()将此元素作为 JsonObject 获取,如果元素是其他类型的元素,则会引发 IlleglastateException 异常,
因此最好先通过调用 isJsonObject() 方法来确保该元素是所需类型之后使用此方法。
JsonPrimitive getAsJsonPrimitive()

将此元素作为 JsonPrimitive 获取,如果元素是其他类型的元素,则会引发 IlleglastateException 异常,
因此最好先通过调用 isJsonPrimitive() 方法来确保该元素是所需的类型之后再使用此方法。

JsonPrimitive 值可以是 Java 字符串、Java 基本数据类型及其包装器类型。

boolean isJsonArray()

验证此元素是否为数组,如果此元素属于 JsonArray 类型,则返回 true,否则返回 false。

boolean isJsonNull()

验证此元素是否表示 null 值,如果此元素的类型为 JsonNull,则返回 true,否则返回 false。

boolean isJsonObject()

验证此元素是否为 JsonObject 对象。

boolean isJsonPrimitive()

以验证此元素是否为 Java 数据类型。
  1. /**
  2. * JsonPrimitive getAsJsonPrimitive():
  3. * 将此元素作为 JsonPrimitive 获取,如果元素是其他类型的元素,则会引发 IlleglastateException 异常,
  4. * 因此最好先通过调用 isJsonPrimitive() 方法来确保该元素是所需的类型之后再使用此方法。JsonPrimitive 值可以是 Java 字符串、Java 基本数据类型及其包装器类型。
  5. */
  6. @Test
  7. public void test12() {
  8. String json = "[\"本级小计\",368.00,328.00,]";
  9. JsonElement sourceJsonElement = new JsonParser().parse(json);
  10. JsonArray jsonArray = sourceJsonElement.getAsJsonArray();
  11. for (int i = 0; i < jsonArray.size(); i++) {
  12. JsonElement jsonElement = jsonArray.get(i);
  13. if (jsonElement.isJsonPrimitive()) {
  14. JsonPrimitive jsonPrimitive = jsonElement.getAsJsonPrimitive();
  15. if (jsonPrimitive.isString()) {
  16. System.out.println(jsonPrimitive.getAsString());
  17. } else if (jsonPrimitive.isNumber()) {
  18. System.out.println(jsonPrimitive.getAsDouble());
  19. }
  20. }
  21. }
  22. }

API 演示源码:src/main/java/com/wmx/gson/JsonObjectTest.java · 汪少棠/apache-study - Gitee.com

src/main/java/com/wmx/gson/JsonArrayTest.java · 汪少棠/apache-study - Gitee.com

JsonObject Json 对象

add(String property, JsonElement value)添加一个健-值对的成员,名称必须是字符串,但值可以是任意的 JsonElement 类型。
addProperty(String property, Boolean value)添加布尔成员的便利方法,指定的值将转换为布尔值的 JsonPrimitive。
addProperty(String property, Character value)添加 char 成员的便利方法,指定的值将转换为字符的 JsonPrimitive。
addProperty(String property, Number value)添加 Number  成员的便利方法,指定的值将转换为数字的 JsonPrimitive。
addProperty(String property, String value)添加 String 成员的便利方法,指定的值将转换为数字的 JsonPrimitive。
Set<Map.Entry<String, JsonElement>> entrySet()返回此对象的所有成员,集合是有序的,与元素的添加顺序相同。
JsonElement get(String memberName)返回具有指定名称的成员。
JsonArray getAsJsonArray(String memberName)获取指定成员作为 JsonArray 的便利方法。
JsonObject getAsJsonObject(String memberName)获取指定成员作为 JsonObject 的便利方法。
JsonPrimitive getAsJsonPrimitive(String memberName)获取指定成员作为 JsonPrimitive  的便利方法。
boolean has(String memberName)检查此对象中是否存在具有指定名称的成员的便利方法。
Set<String> keySet()返回所有成员的 key 值。
JsonElement remove(String property)从此 JsonObject 中删除指定的属性,返回被删除的属性。
int size()返回对象中键/值对的数目。
  1. /**
  2. * int size():返回对象中键/值对的数目。
  3. * Set<String> keySet():返回所有成员的键值
  4. */
  5. @Test
  6. public void jsonObject7() {
  7. String json = "{\"pId\":9527,\"pName\":\"华安\",\"isMarry\":true}";
  8. JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
  9. System.out.println(jsonObject.size());
  10. Set<String> keySet = jsonObject.keySet();//3
  11. System.out.println(keySet);//[pId, pName, isMarry]
  12. }

API 演示源码:src/main/java/com/wmx/gson/JsonObjectTest.java · 汪少棠/apache-study - Gitee.com

JsonArray Json 数组

JsonArray()

JsonArray(int capacity)

两个构造器,一个是创建空的 Json 数组,一个是指定初始容量。
add( Boolean value)将指定的布尔值添加到 json 数组,如 value 为 null,则添加 JsonNull。
add(Character value)将指定的 Character  值添加到 json 数组,如 value 为 null,则添加 JsonNull。
add(Number value)将指定的 Number  值添加到 json 数组,如 value 为 null,则添加 JsonNull。
add(String value)将指定的 String  值添加到 json 数组,如 value 为 null,则添加 JsonNull。
add(JsonElement value)将指定的 JsonElement  值添加到 json 数组,如 value 为 null,则添加 JsonNull。
addAll(JsonArray array)将指定数组中的所有元素添加到此 json 数组。
boolean contains(JsonElement element)如果此数组包含指定的元素,则返回true。
JsonElement get(int i)返回数组的第 i 个元素,如果下标越界,则抛异常
Iterator<JsonElement> iterator()返回一个迭代器来导航数组的元,由于数组是一个有序列表,迭代器按照元素插入的顺序导航元素。
JsonElement remove(int index)删除此数组中指定位置的元素,向左移动任何后续元素(从其索引中减去一个),返回从数组中删除的元素。
boolean remove(JsonElement element)从该数组中删除第一个出现的指定元素(如果存在)。如果数组不包含元素,则它将保持不变。
JsonElement set(int index, JsonElement element)将此数组中指定位置的元素替换为指定元素,元素不能为null。
int size()返回数组的大小。
  1. @Test
  2. public void test4() {
  3. JsonArray jsonArray = new JsonParser().parse("[{\"code\":200,\"msg\":\"成功\"}]").getAsJsonArray();
  4. JsonArray deepCopy = jsonArray.deepCopy();
  5. deepCopy.add("Yes");
  6. System.out.println(jsonArray);//[{"code":200,"msg":"成功"}]
  7. System.out.println(deepCopy);//[{"code":200,"msg":"成功"},"Yes"]
  8. }

API 演示源码:src/main/java/com/wmx/gson/JsonArrayTest.java · 汪少棠/apache-study - Gitee.com

JsonParser Json 解析

1、JsonParser 用于将 Json 字符内容解析为  json 元素 JsonElement。

JsonElement parse(Reader json)将指定的 JSON 字符串字符输入流解析为 Json 元素,如果指定的文本不是有效的 JSON 字符串,则抛出 JsonParseException 异常。
JsonElement parse(String json)将指定的 JSON 字符串解析为 Json 元素,如果指定的文本不是有效的 JSON 字符串,则抛出 JsonParseException 异常。
  1. @Test
  2. public void test1() {
  3. String json = "{\"id\":1000,\"name\":\"华安\",\"birthday\":\"Jul 13, 2020 8:46:42 PM\",\"marry\":true}";
  4. JsonParser jsonParser = new JsonParser();
  5. JsonElement jsonElement = jsonParser.parse(json);
  6. JsonObject jsonObject = jsonElement.getAsJsonObject();
  7. System.out.println(jsonObject);//{"id":1000,"name":"华安","birthday":"Jul 13, 2020 8:46:42 PM","marry":true}
  8. }

API 演示源码:src/main/java/com/wmx/gson/JsonParserTest.java · 汪少棠/apache-study - Gitee.com

GsonBuilder 构建 Gson

1、对于默认配置的 Gson,直接使用 new Gson 更简单,当需要设置默认值以外的配置选项时,使用 GsonBuilder 构建器,调用它的各种配置方法,最后调用 create 方法创建 Gson 对象。

GsonBuilder serializeNulls()序列化空字段,默认情况下,Gson 序列化期间会忽略所有为 null 的字段
GsonBuilder setDateFormat(String pattern)根据提供的模式序列化 Date 日期对象,可以多次调用,但只有最后一次调用将用于决定序列化格式。

 GsonBuilder setFieldNamingPolicy(FieldNamingPolicy namingConvention)

1、配置为在序列化和反序列化期间将特定命名策略应用于对象的字段。

2、namingConvention:用于序列化和反序列化的 JSON 字段命名约定/策略,可选值如下:

IDENTITY:使用对象默认的字段名称
UPPER_CAMEL_CASE:使用驼峰命名
UPPER_CAMEL_CASE_WITH_SPACES:将 Java 字段名的第一个'字母'在序列化为JSON格式时大写,单词之间用空格隔开
LOWER_CASE_WITH_UNDERSCORES:使用此命名策略将把 Java 字段名从大小写形式修改为全小写字段名,其中单词之间由下划线分隔
LOWER_CASE_WITH_DASHES:使用此命名策略将把 Java 字段名从大小写形式修改为全小写字段名,其中单词之间用破折号(-)分隔
LOWER_CASE_WITH_DOTS:使用此命名策略将 Java 字段名从大小写形式修改为全小写字段名,其中每个单词用点(.)分隔。

  1. @Test
  2. public void test1() {
  3. Gson gson = new GsonBuilder()
  4. .serializeNulls()
  5. .setDateFormat("yyyy-MM-dd HH:mm:ss")
  6. .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY)
  7. .create();
  8. Person person = new Person();
  9. person.setId(100);
  10. person.setBirthday(new Date());
  11. String toJson = gson.toJson(person);
  12. //{"id":100,"name":null,"birthday":"2020-07-19 11:37:35","marry":null}
  13. System.out.println(toJson);
  14. Person person1 = gson.fromJson(toJson, Person.class);
  15. //Person{id=100, name='null', birthday=Sun Jul 19 11:37:35 CST 2020, marry=null}
  16. System.out.println(person1);
  17. }

API 演示源码:src/main/java/com/wmx/gson/GsonBuilderTest.java · 汪少棠/apache-study - Gitee.com

Spring Boot 使用 Gson 替换 Jackson

1、Spring Boot 提供了三个 JSON 库的集成:Gson、Jackson、JSON-B, 默认使用 jackson。

第一步:排除 jackson 依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-json</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>

在启动类 @SpringBootApplication 注解中,排除掉 Jackson 的自动装配:

@SpringBootApplication(exclude = { JacksonAutoConfiguration.class })

 第二步:添加 Gson 依赖

  1. <dependency>
  2. <groupId>com.google.code.gson</groupId>
  3. <artifactId>gson</artifactId>
  4. </dependency>

第三步:配置属性

1、在全局配置文件中添加如下配置,指定 Spirng MVC 使用 Gson 的 HttpMessageConverter 实现,GsonHttpMessageConverter:

spring.mvc.converters.preferred-json-mapper=gson

2、Spring Boot 为 Gson 预定义了很多配置属性,可以通过它们来自定义 Gson 的特性:

完整配置:https://springdoc.cn/spring-boot/application-properties.html#appendix.application-properties.json/

  1. spring.gson.date-format= # Date 对象序列化时使用的格式。
  2. spring.gson.disable-html-escaping= # 是否禁止转义 HTML 字符,如 "<"">" 等。
  3. spring.gson.disable-inner-class-serialization= # 序列化时是否排除内部类。
  4. # 是否启用复杂 map key(即非基础类型)的序列化。
  5. spring.gson.enable-complex-map-key-serialization=
  6. # 是否将所有没有 @Expose 注解的字段排除在序列化或反序列化之外。
  7. spring.gson.exclude-fields-without-expose-annotation=
  8. spring.gson.field-naming-policy= # 在序列化和反序列化时应用于对象字段的命名策略。
  9. # 是否通过在输出前添加一些特殊文本来生成不可执行的 JSON。
  10. spring.gson.generate-non-executable-json=
  11. spring.gson.lenient= # 是否对不符合 RFC 4627 的 JSON 进行宽松解析。
  12. spring.gson.long-serialization-policy= # Long 和 long 类型的序列化策略。
  13. spring.gson.pretty-printing= # 是否输出格式化后的 JSON 字符串。
  14. spring.gson.serialize-nulls= # 是否输出格式化后的 JSON 字符串。

自定义配置

1、如果全局配置属性不满足需求,那么也可以通过在配置类中自定义 GsonBuilder Bean 来对 Gson 进行自定义配置。

2、例如,自定义 Gson 对 LocalDateTime 类型的格式化:

  1. @Configuration
  2. public class GsonConfig {
  3. @Bean
  4. public GsonBuilder gsonBuilder(List<GsonBuilderCustomizer> customizers) {
  5. // 创建 GsonBuilder
  6. GsonBuilder builder = new GsonBuilder();
  7. // 序列化空字段,默认情况下,Gson 序列化期间会忽略所有为 null 的字段
  8. builder.serializeNulls();
  9. // 加载配置文件中的配置属性。customizers 是读取到的配置文件中关于 Gson 的配置
  10. customizers.forEach((c) -> c.customize(builder));
  11. // 编程式自定义
  12. DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  13. // LocalDateTime 类型的格式化
  14. builder.registerTypeHierarchyAdapter(LocalDateTime.class, new JsonSerializer<LocalDateTime>() {
  15. @Override
  16. public JsonElement serialize(LocalDateTime src, Type typeOfSrc, JsonSerializationContext context) {
  17. return new JsonPrimitive(DATE_TIME_FORMATTER.format(src));
  18. }
  19. });
  20. return builder;
  21. }
  22. }

3、然后可以在任意地方注入 com.google.gson.Gson 对象使用。

  1. @Autowired
  2. private Gson gson;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/834182
推荐阅读
相关标签
  

闽ICP备14008679号