专属目录
爪哇基础 之 使用 Jackson 处理 JSON 序列化与反序列化
前言
日常Java开发中也就自然而然的经常会遇到JSON的序列化与反序列化,而面对JSON序列化工具我们常用的有阿里的 Fastjson、Spring MVC 内置的 Jackson还有谷歌的Gson,前面我们也说了 谷歌的Gson,若不知道的小伙伴可点击查看 ,那么今天我们来说下 Spring MVC 内置的 Jackson 是如何处理 JSON 序列化与反序列化!
Jackson 简介
Jackson 是一个 Java 用来处理 JSON 格式数据的的类库,性能非常好,功能非常强大。除了支持常用的json,同时还支持 Smile,BSON,XML,CSV,YAML。
特点
-
Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快
-
运行时占用内存比较低,性能比较好
-
有灵活的 API,可以很容易进行扩展和定制。
Jackson的json库
Jackson 的 json库 提供了3种API
-
Streaming API: 性能最好 -
Tree Model: 最灵活 -
Data Binding: 最方便
其中最常用的就是Data Binding,为什么呢?
因为 Data Binding 中使用的 ObjectMapper 是线程安全的,所以应该重用。
Jackson 的 核心模块
-
jackson-core核心包,提供基于”流模式”解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。
-
jackson-annotations注解包,提供标准注解功能;
-
jackson-databind数据绑定包, 提供基于”对象绑定” 解析的相关 API ( ObjectMapper ) 和”树模型” 解析的相关 API (JsonNode);基于”对象绑定” 解析的 API 和”树模型”解析的 API 依赖基于”流模式”解析的 API。
注意
Jackson 是基于 JavaBean 来序列化属性的,所以必须写 set与get 方法 。如果属性没有 GETTER 方法,默认是不会输出该属性的
下面我们来说下 Jackson 的常用的方法,想要使用前肯定得先下载 Jackson 的jar 包
下载
注意
如果小伙伴们使用的是 Spring 和 Spring MVC 、Spring Boot 项目,可以不需要下载 jar 包 和 导包 , 因为 Spring MVC 内置了 Jackson 的依赖包
若是基础的 Web 项目可看下如何下载 Jackson
maven 方式
在 pom.xml 直接引入 Gson 依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
jar 引入方式
直接复制以下链接,下载对应的 jar 包,引入项目的 lib 目录下即可
Central Maven repository
Wiki
下载好了接下来我们就看看如何使用!
前提
上边简介也说了, Jackson 主要是用来处理 Java 的 JSON 格式数据的的类库
那首先肯定要创建一个 Java 实体类
实体类 Student.java
package com.gsontest.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName: Student
* @Description: (描述)
* @Author: WHT
* @Version: V1.0
* @Date: 2020/10/23 15:29
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private Integer no;
private String name;
private String sex;
private Integer age;
}
Jackson 的核心类
前面我们也说了 Jackson 最常用的是 Data Binding ,那么在使用Jackson之前,我们先来了解一下Jackson中的一个核心类—— ObjectMapper
因为Jackson的所有JSON操作都在使用该类的API
ObjectMapper
ObjectMapper 是 JSON 操作的核心,它有多个 JSON 序列化的方法,可以把 JSON 字符串保存File、OutputStream 等不同的介质中
ObjectMapper 通过 writeValue 系列方法 将 java 对 象序列化 为 json,并 将 json 存 储成不同的格式,String(writeValueAsString),Byte Array(writeValueAsString),Writer, File,OutStream 和 DataOutput。
ObjectMapper 通过 readValue 系列方法从不同的数据源像 String , Byte Array, Reader,File,URL, InputStream 将 json 反序列化为 java 对象。
下面来说下 ObjectMapper 几个 writeValue 主要使用的方法
-
writeValue(File arg0, Object arg1)把
arg1转成json序列,并保存到arg0文件中 -
writeValue(OutputStream arg0, Object arg1)把
arg1转成json序列,并保存到arg0输出流中 -
writeValueAsBytes(Object arg0)把
arg0转成json序列,并把结果输出成字节数组 -
writeValueAsString(Object arg0)把
arg0转成json序列,并把结果输出成字符串
readValue 主要的使用方法
-
readValue (String content, Class<T> valueType)把
json序列字符串转成valueType对象,并把结果输出所映射的对象
这些方法使用起来都十分简单!下面我们就来用代码演示下如何使用!
JSON序列化
把 Java 实体对象转换为 json(「序列化」)
实例
这里就只介绍下 writeValueAsString(Object obj)的使用方法,用于将Java对象转换为一个JSON字符串
package com.gsontest.test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gsontest.bean.Student;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: JacksonToJsonTest
* @Description: (描述)
* @Author: WHT
* @Version: V1.0
* @Date: 2020/11/3 16:16
*/
public class JacksonToJsonTest {
public static void main(String[] args) throws JsonProcessingException {
//创建 Student 实体类
Student studentOne = new Student(1001, "序列化实体一", "男", 28);
Student studentTwo = new Student(2001, "序列化实体二", "女", 20);
ObjectMapper objectMapper = new ObjectMapper();
//Student类转JSON
//Student类转JSON 的结果为 :
//{"no":1001,"name":"序列化实体一","sex":"男","age":28}
String json = objectMapper.writeValueAsString(studentOne);
System.out.println("Student类转JSON 的结果为 :\n" + json + "\n");
//Java集合转JSON
//Java集合转JSON 的结果为 :
//[{"no":1001,"name":"序列化实体一","sex":"男","age":28},{"no":2001,"name":"序列化实体二","sex":"女","age":20}]
List<Student> studentList = new ArrayList<Student>();
studentList.add(studentOne);
studentList.add(studentTwo);
String jsonList = objectMapper.writeValueAsString(studentList);
System.out.println("Java集合转JSON 的结果为 :\n" + jsonList);
}
}
运行结果
Student类转JSON 的结果为 :
{"no":1001,"name":"序列化实体一","sex":"男","age":28}
Java集合转JSON 的结果为 :
[{"no":1001,"name":"序列化实体一","sex":"男","age":28},{"no":2001,"name":"序列化实体二","sex":"女","age":20}]
JSON反序列化
Jackson 提供了许多JSON反序列化的方法,其中比较常用的方法 就是 readValue
实例
具体将 json 转换为 实体对象 和 List 集合对象可见以下代码示例
package com.gsontest.test;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.gsontest.bean.Student;
import java.io.IOException;
import java.util.List;
/**
* @ClassName: JacksonFromJsonTest
* @Description: (描述)
* @Author: WHT
* @Version: V1.0
* @Date: 2020/11/3 17:42
*/
public class JacksonFromJsonTest {
public static void main(String[] args) throws IOException {
//上文实例代码 序列化的 json 字符串
String json = "{\"no\":1001,\"name\":\"序列化实体一\",\"sex\":\"男\",\"age\":28}";
String jsonList = "[{\"no\":1001,\"name\":\"序列化实体一\",\"sex\":\"男\",\"age\":28},{\"no\":2001,\"name\":\"序列化实体二\",\"sex\":\"女\",\"age\":20}]";
/*
* ObjectMapper支持 String , Byte Array, Reader,File,URL, InputStream 等 将 json 反序列化为 java 对象
*/
ObjectMapper objectMapper = new ObjectMapper();
Student student = objectMapper.readValue(json, Student.class);
System.out.println("String json字符串 反序列化为 Student 对象的结果为:\n" + student + "\n");
/*
* 对于 List 类型 ,可以调用 constructCollectionType 方法来序列化,也可以构造 TypeReference 来序列化。
*/
// 方法一 : 调用 constructCollectionType 方法来序列化
CollectionType javaType = objectMapper.getTypeFactory().constructCollectionType(List.class, Student.class);
// List<Student> studentList = objectMapper.readValue(jsonList, javaType);
//方法二 : 构造 TypeReference 来序列化
List<Student> studentList = objectMapper.readValue(jsonList, new TypeReference<List<Student>>(){});
System.out.println("studentList 集合遍历的结果:");
for (Student stu : studentList) {
System.out.println(stu);
}
}
}
运行结果
String json字符串 反序列化为 Student 对象的结果为:
Student(no=1001, name=序列化实体一, sex=男, age=28)
studentList 集合遍历的结果:
Student(no=1001, name=序列化实体一, sex=男, age=28)
Student(no=2001, name=序列化实体二, sex=女, age=20)
实例到这就讲解完了!下面我们来看下 Jackson 的注解的使用!
Jackson 的 注解的使用
Jackson 根据它的默认方式序列化和反序列化 java 对象,若根据实际需要,灵活的调整它的默认方式,可以使用 Jackson 的注解。
Jackson 常用的注解及用法如下
| 注解 | 用法 |
|---|---|
| @JsonProperty | 用于属性,把属性的名称序列化时转换为另外一个名称。示例: @JsonProperty(“str_name”) private String name; |
| @JsonFormat | 用于属性或者方法,把属性的格式序列化时转换成指定的格式。示例: @JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm”) public Date cDate() |
| @JsonPropertyOrder | 用于类, 指定属性在序列化时 json 中的顺序 , 示例: @JsonPropertyOrder({ “str_name”, “age” }) public class Student |
| @JsonCreator | 用于构造方法,和 @JsonProperty 配合使用,适用有参数的构造方法。 示例: @JsonCreator public Student(@JsonProperty(“name”)String name) {…} |
| @JsonAnySetter | 用于属性或者方法,设置未反序列化的属性名和值作为键值存储到 map 中 @JsonAnySetter public void set(String key, Object value) { map.put(key, value); } |
| @JsonAnyGetter | 用于方法 ,获取所有未序列化的属性 public Map<String,Object> any() { return map; } |
后续我们详细说下Jackson 的 注解是如何使用的,这里只简单描述下。
总结
看到这,Java 的 Jackson 是如何处理 JSON的序列化与反序列化就到此完结了,是不是非常nice,数据交互起来就更完美!快去试一试吧!别着急,还有更多的秘密等着你来探索!

分享嗨起来,美德传起来,点个星标从此探索之路不迷茫!
微信扫描二维码,关注我的原创日更公众号,可以查看更多程序的秘密!

674

被折叠的 条评论
为什么被折叠?



