jackson-java對象的json序列化,非常蠢的經歷(另附json正反序列化小demo+單例模式)

日常

總算是把版本2.0寫完了,晚上通一通接口,看看還有哪些小bug。

今天說說我下午發現的關於java對象的json序列號的一個問題,大概就是在使用jackson的包序列化對象的時候,有兩個我後來添加的成員怎麼也無法被序列化!總是缺少那兩個屬性!

問題原因

絲毫沒有辦法的我,查了一通資料,竟然發現沒有和我類似經歷的人!只好自己找問題所在了……
其實實際問題是:我要序列化的那個對象,因爲我新增了屬性,而新增的屬性我沒有寫getter,所以private是無法被jackson的包訪問到的!

解決

寫了getter之後,問題順利解決

附:jackson包使用小demo+單例模式

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;

public class JacksonDemo {
    //私有靜態實例,賦值爲空,延遲加載
    private static ObjectMapper objectMapper=null;
    //私有構造,防止實例化
    private JacksonDemo(){}
    //靜態方法創建單個實例
    public static ObjectMapper getObjectMapper(){
        if(objectMapper==null){
            objectMapper=new ObjectMapper();
        }
        return objectMapper;
    }

    private static String toJson(Object object) throws JsonProcessingException {
        //java對象序列化爲Json字符串
        return getObjectMapper().writeValueAsString(object);
    }

    private static <T> T  fromJson(String json,Class<T> type) throws IOException {
        //將Json字符串反序列化爲java對象
        return getObjectMapper().readValue(json,type);
    }

    public static void main(String[] args) {
        //status是一個有三個私有屬性的類,分別是String status,String msg,Object data;
        Status status=new Status();
        status.setData("abc");
        try {
            //將status輸出爲json字符串
            System.out.println(toJson(status));
            //將json字符串轉換爲Status對象
            String json="{\"status\":\"success\",\"msg\":\"seller goods found successfully!\",\"data\":[{\"id\":\"014352373888\",\"name\":\"%E4%BC%91%E9%97%B2%E5%A8%B1%E4%B9%90+%E6%91%84%E5%BD%B1%E4%B9%8B%E5%9C%B0\",\"price\":128.0,\"city\":null,\"route\":null,\"pictures\":[\"/img/goods/014352373888/1.png\"],\"description\":null,\"comment\":null,\"seller\":{\"headPicture\":\"/img/headPic.png\",\"phoneNumber\":\"11111111111\",\"sex\":null,\"name\":\"testuser\"},\"pubtime\":\"1514523738880\"}]}";
            Status s=fromJson(json,Status.class);
            System.out.println(s.getStatus());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

總結

結果如圖,emmmmmm。

  • 這裏可以看到轉換成json字符串就比較單一
  • 轉換成java對象,仔細看小框:對於我給出的class文件,它會正確的實例化這個類,而我類裏的Object對象由於沒有特定的類,所以默認鍵值對是使用的LinkedHashMap,而鍵值對之間的數組使用的是ArrayList
    結果

PS:2018年快樂!
關於Jackson註解的內容參考大佬的文章 Jackson常用註解介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章