添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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);