Jackson 是一款非常好用的 json 转换工具,可以帮助我们完成 json 和 Java 的 Object 的互相转换
什么是序列化和反序列化?
- 序列化(Serialize) : 将 Java Object 转换成 json
- 反序列化(Deserialize) : 将 json 转换成 Java Object
在 SpringBoot 裡使用 Jackson
只要在 maven 中加入 spring-boot-starter-web
的 dependency 就可以了
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
Jackson 和 Object、List、Map 的互转
先定义一个 User 类
public class User {
private int id;
private String name;
// 省略constructor, getter, setter
}
使用 Jackson 完成 json 和 Object、List、Map 的互转
import java.util.*;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class MainTest {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// User Object 转 json
User user1 = new User(123, "John");
String json = objectMapper.writeValueAsString(user1);
// json 转 User Object
User user2 = objectMapper.readValue(json, User.class);
// List 转 json
List ulist = new ArrayList<>();
User user4 = new User(123, "John");
ulist.add(user4);
String ujson = objectMapper.writeValueAsString(ulist);// json 转 List
List urlist = objectMapper.readValue(ujson, new TypeReference>() {});// Map 转 json
HashMap umap = new HashMap<>();
User user3 = new User(123, "John");
umap.put("John", user3);
String mjson2 = objectMapper.writeValueAsString(umap);// json 转 Map
Map urMap = objectMapper.readValue(mjson2, new TypeReference>() {});
}
}
Deserialize 自定义的泛型类
如果要 deserialize 的是自定义的泛型类,那就需要特殊处理,不能够像 List
和 Map
那样直接用 TypeReference 互转
原因是因为 List
实际上存的还是 Object,他只是取出来的时候强行转换成 T 而已
先定义一个泛型类
public class Hit<T> {
private Integer id;
private T source;
// 省略getter, setter
}
再定义一个正常的 Apple 类
public class Apple {
private String color;
private Integer weight;
//省略getter/setter
}
待转换的 json
{
"id": 111,
"source": {
"color": "red",
"weight": 100
}
}
使用 Jackson 将 json 转换成带有泛型的类
public class MyTest {
// 使用 Jackson 将 json 转成泛型类的方法
public static Hit convert(String json, Class targetClass) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
Hit hit = null;
JavaType clazzType = objectMapper.getTypeFactory().constructParametricType(Hit.class, targetClass);
hit = objectMapper.readValue(json, clazzType);return hit;
}public static void main(String[] args) {// 实际用起来会像这样
String json = "{\"id\": 111,\"source\": {\"color\": \"red\",\"weight\": 100}}";
Hit appleHit = convert(json, Apple.class);
}
}