ObjectMapper 是一款非常好用的 json 轉換工具,可以幫助我們完成 json 和 Java 的 Object 的互相轉換
什麼是 Serialize 和 Deserialize?
Serialize : 將 Java Object 轉換成 json
Deserialize : 將 json 轉換成 Java Object
在 Spring Boot 裡使用 ObjectMapper
ObjectMapper 是由 Jackson library 所提供的一個功能,所以只要在 maven 中加入
spring-boot-starter-web
的 dependency 就可以了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Json 和 Java Object、List、Map 的互轉
先定義一個 User class
public class User {
private int id;
private String name;
// 省略constructor, getter, setter
使用 ObjectMapper 完成 json 和 Java 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<User> 轉 json
List<User> ulist = new ArrayList<>();
User user4 = new User(123, "John");
ulist.add(user4);
String ujson = objectMapper.writeValueAsString(ulist);
// json 轉 List<User>
List<User> urlist = objectMapper.readValue(ujson, new TypeReference<List<User>>() {});
// Map<String, User> 轉 json
HashMap<String, User> umap = new HashMap<>();
User user3 = new User(123, "John");
umap.put("John", user3);
String mjson2 = objectMapper.writeValueAsString(umap);
// json 轉 Map<String, User>
Map<String, User> urMap = objectMapper.readValue(mjson2, new TypeReference<HashMap<String, User>>() {});
Deserialize 自定義的泛型 class
如果要 deserialize 的是自定義的泛型 class,那就需要特殊處理,不能夠像
List<T>
和
Map<T, R>
那樣直接用 TypeReference 互轉
原因是因為
List<T>
實際上存的還是 Object,他只是取出來的時候強行轉換成 T 而已
先定義一個泛型 class
public class Hit<T> {
private Integer id;
private T source;
// 省略getter, setter
再定義一個正常的 Apple class
public class Apple {
private String color;
private Integer weight;
//省略getter/setter
待轉換的 json
"id"
:
111
,
"source"
: {
"color"
:
"red"
,
"weight"
:
100
使用 ObjectMapper 將 json 轉換成帶有泛型的 class
public class MyTest {
// 使用 ObjectMapper 將 json 轉成泛型 class 的方法
public static <T> Hit<T> convert(String json, Class<T> targetClass) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
Hit<T> 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<Apple> appleHit = convert(json, Apple.class);