https://github.com/zq2599/blog_demosjava
內容:全部原創文章分類彙總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;git
本文是《jackson學習》系列的第四篇,前面學習了經常使用API,能夠執行最基本的序列化和反序列化操做,接下來要學習的就是jackson強大的註解能力,本篇要學的是root對象特性,主要內容以下:程序員
{ "id" : 1, "name" : "book" }
{ "aaabbbccc" : { "id" : 2, "name" : "food" } }
root對象特性提早作個小結,這樣若是您時間有限,僅看這一節便可:github
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
{ "id" : 1, "name" : "book" }
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
{ "id" : 1, "name" : "book" }
用對比的方式能夠更清楚瞭解JsonRootName的做用,接下來的學習我們準備兩個POJO類,一個沒有JsonRootName註解,另外一個有JsonRootName註解:web
public class Order1 { private int id; private String name; // 省去get、set、toString方法 ... }
import com.fasterxml.jackson.annotation.JsonRootName; @JsonRootName(value = "aaabbbccc") public class Order2 { private int id; private String name; // 省去get、set、toString方法 ... }
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
public static void main(String[] args) throws Exception { // 實例化Order1和Order2 Order1 order1 = new Order1(); order1. setId(1); order1.setName("book"); Order2 order2 = new Order2(); order2. setId(2); order2.setName("food"); // 沒有開啓WRAP_ROOT_VALUE的時候 logger.info("沒有開啓WRAP_ROOT_VALUE\n"); ObjectMapper mapper1 = new ObjectMapper(); // 美化輸出 mapper1.enable(SerializationFeature.INDENT_OUTPUT); logger.info("沒有JsonRootName註解類,序列化結果:\n\n{}\n\n", mapper1.writeValueAsString(order1)); logger.info("有JsonRootName註解的類,序列化結果:\n\n{}\n\n\n\n", mapper1.writeValueAsString(order2)); // 開啓了WRAP_ROOT_VALUE的時候 logger.info("開啓了WRAP_ROOT_VALUE\n"); ObjectMapper mapper2 = new ObjectMapper(); // 美化輸出 mapper2.enable(SerializationFeature.INDENT_OUTPUT); // 序列化的時候支持JsonRootName註解 mapper2.enable(SerializationFeature.WRAP_ROOT_VALUE); logger.info("沒有JsonRootName註解類,序列化結果:\n\n{}\n\n", mapper2.writeValueAsString(order1)); logger.info("有JsonRootName註解的類,序列化結果:\n\n{}", mapper2.writeValueAsString(order2)); }
{ "id" : 2, "name" : "food" }
3. 那下面這個字符串能反序列化成Order2對象嗎?spring
{ "aaabbbccc" : { "id" : 2, "name" : "food" } }
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
3. 值得注意的是,上述json字符串中,root對象的key爲aaabbbccc,這和Order2的JsonRootName註解的value值是一致的,若是不一致就會反序列化失敗,以下圖:數據庫
微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demosjson