Jackson是一个基于Java的高性能JSON处理器,其核心功能是实现数据与Java对象之间的序列化/反序列化。
Jackson最初只是实现JSON数据的绑定,但是发展至今,它也支持其他格式的数据,只要有对应的解析器和生成器就可以了。
由于JSON格式简单,序列化速度也比较快,深受广大程序员们的喜欢。大多数时候,我们提到Jackson,或者使用Jackson,都是用来处理JSON数据的。
在开始使用之前,第一步是获得Jackson包,配置好依赖关系。
目前广泛使用的依赖管理工具,主要有Maven和Gradle,我们以Maven为例。
Maven依赖配置
使用Jackson只需要声明一个依赖包jackson-databind,版本号可以根据实际情况进行设置。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
实际上,jackson-databind包依赖于jackson-core和jackson-annotations两个包。如果使用Maven或Gradle,那么这两个包会自动被引用进来,不需要单独声明。
如果不使用依赖管理工具,那么需要手工去下载这3个包,并引入到工程里面。
jackson-databind的GitHub地址:https://github.com/FasterXML/jackson-databind (opens in a new tab)
第一个例子
首先,定义一个简单的Java类,用于封装数据。
public class People {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
序列化
为了进行序列化,需要创建一个ObjectMapper对象,然后调用它的writeValue*方法传入对象进行序列化。
以下例子,先创建一个People对象,然后依次序列化为JSON字符串、字节数组和JSON字符串序列化到目标文件中。
@Test
public void serialize() throws IOException {
// 创建一个Java Bean对象
People people = new People();
people.setName("sam");
people.setAge(26);
// 为了进行序列化/反序列化,需要创建一个ObjectMapper对象
ObjectMapper mapper = new ObjectMapper();
// 将people对象序列化为字符串
String jsonString = mapper.writeValueAsString(people);
System.out.println("序列化为JSON字符串:" + jsonString);
// 将people对象序列化为字节数组
byte[] jsonBytes = mapper.writeValueAsBytes(people);
System.out.println("序列化为字节数组,再转换为字符串:" + new String(jsonBytes, "UTF-8"));
// 将people对象序列化为JSON字符串,并保存到文件result.json中
mapper.writeValue(new File("result.json"), people);
}
执行结果:
序列化为JSON字符串:{"name":"sam","age":26}
序列化为字节数组,再转换为字符串:{"name":"sam","age":26}
result.json文件内容为:{"name":"sam","age":26}
反序列化
与writeValue*相对应,反序列化使用的是readValue方法,支持从字符串、字节数组、本地文件和远程文件等地方进行反序列化。
@Test
public void deserialize() throws IOException {
// 为了进行序列化/反序列化,需要创建一个ObjectMapper对象
ObjectMapper mapper = new ObjectMapper();
// 将JSON字符串反序列化为People对象
People people1 = mapper.readValue("{\"name\":\"fanny\", \"age\":26}", People.class);
System.out.println("name: " + people1.getName() + ", age: " + people1.getAge());
// 将文件中的JSON字符串反序列化为People对象
People people2 = mapper.readValue(new File("D://result.json"), People.class);
System.out.println("name: " + people2.getName() + ", age: " + people2.getAge());
// 将字节数组反序列化为People对象
byte[] jsonBytes = mapper.writeValueAsBytes(people2);
People people3 = mapper.readValue(jsonBytes, People.class);
System.out.println("name: " + people3.getName() + ", age: " + people3.getAge());
// 读取网络文件中的JSON字符串,并反序列化为People对象
People people4 = mapper.readValue(new URL("http://youwebsite.com/result.json"), People.class);
System.out.println("name: " + people4.getName() + ", age: " + people4.getAge());
}
执行结果:
name: fanny, age: 26
name: sam, age: 26
name: sam, age: 26
name: sam, age: 26
好了,Jackson入门就先讲这么多,更多内容可参考官方Github。
参考
https://github.com/FasterXML/jackson-databind (opens in a new tab)
https://github.com/FasterXML/jackson-docs (opens in a new tab)