要想人前顯貴,必須背後受罪。關注公衆號【BAT的烏托邦】開啓專欄式學習,拒絕淺嘗輒止。本文 https://www.yourbatman.cn 已收錄,裏面一併有Spring技術棧、MyBatis、中間件等小而美的專欄供以學習哦。html
--> 返回專欄總目錄 <--
代碼下載地址:https://github.com/yourbatman/jackson-learning
java
前言
各位小夥伴你們好,我是A哥。上篇文章 【Fastjson到了說再見的時候了】 A哥跟Fastjson說了拜拜,從本系列開始,咱們將一塊兒進入Jackson庫的學習。固然嘍說它是世界上最好的JSON庫並不是一家之言,是官網上它本身說的,我免責申明哈。android
一個工程僅需一個JSON庫
Java的JSON庫,你至少應該用過/聽過這三種:Jackson、Gson、Fastjson
。一個獨立的工程,按照依賴最少原則,本應該only one JSON庫是足矣的。但現狀是:各位同仁可觀察觀察各自的項目,大都同時存在2種JSON庫,亦或者3種甚至更多...git
說明:在同一個工程內,同一功能如有多種實現,實屬很差的現象。這會讓管理起來顯得混亂(譬如對日期的格式化就不方便作到統一),出口如有多個,想收口時就是個大難題了程序員
做爲一個合格的架構師/工程師,保持最簡依賴(一致性依賴)是應該有的技術範,由於簡單一致性它能帶來很大的收益,道理很簡單:兩個Java程序員的溝通/協同效率,必定會比1個Java + 1個Python溝通效率高。github
so what,咱們應該選擇哪種JSON庫呢?答案顯而易見,那即是Jackson。由於它各個方面表現均很是優秀,是世界最流行、最好的JSON庫。把Jackson
做爲工程惟一JSON庫是有一丟丟門檻的(想一想你爲什麼使用Fastjson就知道啦),因此它來啦,祝你跨越此門檻,規範化使用,助你增長一項主流的硬核實力,這也是本專欄的最大意義所在。json
Jackson是世界最好的JSON庫
Jackson是一個簡單的、功能強大的、基於Java的應用庫。它能夠很方便完成Java對象和Json對象(xml文檔or其它格式)進行互轉。Jackson社區相對比較活躍,更新速度也比較快。Jackson庫有以下幾大特性:安全
- 高性能且穩定:低內存佔用,對大/小JSON串,大/小對象的解析表現均很優秀
- 流行度高:是不少流行框架的默認選擇
- 容易使用:提供高層次的API,極大簡化了平常使用案例
- 無需本身手動建立映射:內置了絕大部分序列化時和Java類型的映射關係
- 乾淨的JSON:建立的JSON具備乾淨、緊湊、體積小等特色
- 無三方依賴:僅依賴於JDK
- Spring生態加持:jackson是Spring家族的默認JSON/XML解析器(明白了吧,學完此專欄你對Spring都能更親近些了,一箭雙鵰)
版本約定:本專欄統一使用的版本號固定爲2.10.1
(2019-12-09發佈),GAV以下:架構
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.10.1</version> </dependency>
爲了保持版本的統一性,後續的Spring Boot(2.2.2.RELEASE)/Spring Framework(5.2.2.RELEASE)
使用的均爲當前最新版本,由於它內置的jackson也剛好就是本專欄講解的版本。app
正文
細心的朋友從上面的groupId
裏能夠看到:jackson
它隸屬於fasterxml
這個組織。本着追本溯源的精神,能夠稍微的瞭解瞭解這個組織:fasterxml官網 截圖以下
簡單翻譯:FasterXML是Woodstox流的XML解析器、Jackson流的JSON解析器、Aalto非阻塞XML解析器以及不斷增加的實用程序庫和擴展家族背後的業務。
做爲一個高度流行的開源庫,這種官網頁面應該刷新了你的認知吧。並非它內容很少,而實際上是它的詳細介紹都發布在github
上了,這即是接下來咱們來認識它的主要渠道。
這種作法貌似已經成爲了一種流行的趨勢:愈來愈多的開源軟件傾向於把github做爲他們的Home Page了
fasterxml
組織它直屬的一級工程其實也有很多:
- com.fasterxml.jackson
- com.fasterxml.uuid
- com.fasterxml.woodstox
- ...
很顯然,本專欄僅僅只會關注jackson工程,該工程即是該組織最出名且最最最爲重要的部分。
官網介紹
瞭解一門新的技術,第一步應該就是看它的官網。上面已然解釋了,fasterxml
組織它把各工程的首頁內容都託管在了github上,Jackson固然也不例外。Jackson官網 上對它本身有以下描述:
Jackson舊稱爲:Java(或JVM平臺)的標準JSON庫,或者是Java的最佳JSON解析器,或者簡稱爲「Java的JSON」
從這名字就霸氣外露了,NB得不行,足以見得它在JSON解析方面的地位和流行程度,固然主要是自信
更重要的是,Jackson是一套JVM平臺的 數據處理(不限於JSON) 工具集:包括 一流的 JSON解析器/ JSON生成器、數據綁定庫(POJOs to and from JSON);而且提供了相關模塊來支持 Avro, BSON, CBOR, CSV, Smile, Properties, Protobuf, XML or YAML等數據格式,甚至還支持大數據格式模塊的設置。
分支:1.x和2.x
Jackson有兩個主要的分支:
- 1.x分支,處於維護模式,只發布bug修復版本(最近一次發佈於Jul, 2013)
- 2.x是正在開發的版本(持續更新升級中,2.0.0發佈於Mar, 2012)
注意:這兩個主要版本使用不一樣的Java包名和Maven GAV,所以它們並不相互兼容,但能夠和平共存。一個項目能夠同時依賴於這兩個版本是沒有衝突的。這是通過設計而爲之,選擇這種策略是爲了更順利地從1.x進行遷移2. x
說明:如今都2020年了,1.x能夠絕不客氣的說已經淘汰了(除了很是老的項目還在用),所以針對1.x版本本專欄不會有任何涉獵。
模塊介紹
Jackson是個開源的、且開放的社區。下面列出的大多數項目/模塊是由Jackson開發團隊領導的,但也有一些來自Jackson社區的成員
三大核心模塊
core module(核心模塊) 是擴展模塊構建的基礎。Jackson目前有3個核心模塊:
說明:核心模塊的groupId均爲:
<groupId>com.fasterxml.jackson.core</groupId>
,artifactId見下面各模塊所示
- Streaming流處理模塊(
jackson-core
):定義底層處理流的API:JsonPaser和JsonGenerator等,幷包含特定於json的實現。 - Annotations標準註解模塊(
jackson-annotations
):包含標準的Jackson註解 - Databind數據綁定模塊(
jackson-databind
):在streaming包上實現數據綁定(和對象序列化)支持;它依賴於上面的兩個模塊,也是Jackson的高層API(如ObjectMapper)所在的模塊
實際應用級開發中,咱們只會使用到Databind數據綁定模塊,so它是本系列重中之重。下面介紹那些舉足輕重的第三方模塊。
數據類型模塊
這些擴展是Jackson插件模塊(經過ObjectMapper.registerModule()
註冊,下同),並經過添加序列化器和反序列化器來對各類經常使用Java庫數據類型的支持,以便Jackson databind
包(ObjectMapper / ObjectReader / ObjectWriter
)可以順利讀寫/轉換這些類型。
第三方模塊有些是Jackson官方人員直接lead和維護的(主流模塊),也有些是純社區行爲。如今按照這兩個分類分別介紹一下各個模塊的做用:
官方直接維護:
說明:官方維護的這些數據類型模塊的groupId統一爲:
<groupId>com.fasterxml.jackson.datatype</groupId>
,且版本號是和主版本號保持一致的
- 標準集合數據類型模塊:
- Guava:支持Guava的集合數據類型
- HPPC:略
- PCollections:略 (Jackson 2.7新增的支持)
- Hibernate:支持Hibernate的一些特性,如懶加載、proxy代理等
- Joda:支持Joda date/time的數據類型
- JDK7:對JDK7的支持(說明:2.7之後就無用了,覺得2.7版本後最低的JDK版本要求是7)
- Java8:它分爲以下三個子模塊來支持Java8
jackson-module-parameter-names
:此模塊可以訪問構造函數和方法參數的名稱,從而容許省略@JsonProperty
(固然前提是你必須加了編譯參數:-parameters
)jackson-datatype-jsr310
:支持Java8新增的JSR310時間APIjackson-datatype-jdk8
:除了Java8的時間API外其它的API的支持,如Optional
- JSR-353/org.json:略
非官方直接維護:
說明:非官方直接維護的這些模塊groupId是不定的,每一個模塊可能都不同,而且它們的版本號不會隨着官方的主版本號一塊兒走
- jackson-datatype-bolts:對 Yandex Bolts collection types 的支持
- jackson-datatype-commons-lang3:支持Apache Commons Lang v3裏面的一些類型
- jackson-datatype-money:支持
javax.money
- jackson-datatype-json-lib:對久遠的
json-lib
這個庫的支持 - ...
數據格式模塊
Data format modules(數據格式模塊)提供對JSON以外的數據格式的支持。它們中的大多數只是實現streaming API抽象,以便數據綁定組件能夠按原樣使用。
官方直接維護:
說明:這些數據格式的模塊的groupId均爲
<groupId>com.fasterxml.jackson.dataformat</groupId>
,且跟着主版本號走
- Avro/CBOR/Ion/Protobuf/Smile(binary JSON) :這些均屬於二進制的數據格式,它們的artifactId爲:
<artifactId>jackson-dataformat-[FORMAT]</artifactId>
- CSV/Properties/XML/YAML:這些格式熟悉吧,一樣的支持到了這些經常使用的文本格式
非官方直接維護:
因非官方直接維護的模塊過於偏門,所以省略
JVM平臺其它語言
官網有說,Jackson是一個JVM平臺的解析器,所以語言層面不侷限於Java自己,還涵蓋了另外兩大主流JVM語言:Kotlin和Scala
說明:這塊的groupId均爲:
<groupId>com.fasterxml.jackson.module</groupId>
,版本號跟着主版本號走
- jackson-module-kotlin:處理kotlin源生類型
- jackson-module-scala_[scala版本號]:處理scala源生類型
模式支持
Jackson註解爲POJO定義了預期的屬性和預期的處理,除了Jackson自己將其用於讀取/寫入JSON和其餘格式以外,它還容許生成外部模式。上面已講述的數據格式擴展中包含了部分功能,但也仍還有許多獨立的模式工具,如:
- Ant Task for JSON Schema Generation:使用Apache Ant時,使用Jackson庫和擴展模塊從Java類生成JSON
- jackson-json-schema-maven-plugin:maven插件,用於生成JSON
- ...
說明:本部分因實際應用場景實在太少,爲了避免要混淆主要內容,此部分後面亦不會再說起
Jackson jr(用於移動端)
雖然Jackson databind
(如ObjectMapper)是通用數據綁定的良好選擇,但它的佔用空間(Jar包大小)和啓動開銷在某些領域可能存在問題:好比移動端,特別是對於輕量使用(讀或寫)。這種case下,完整的Jackson API是讓人接受不了的。
因爲全部這些緣由,Jackson官方決定建立一個更簡單、更小的庫:Jackson jr。它仍舊構建在Streaming API之上,但不依賴於databind和annotation。所以,它的大小(jar和運行時內存使用)要小得多,它的API很是緊湊,因此適合APP等移動端。
<dependency> <groupId>com.fasterxml.jackson.jr</groupId> <artifactId>jackson-jr-objects</artifactId> </dependency>
它僅僅只依賴了jackson-core
模塊,因此體積上控制得很是的好。Jackson單單三大核心模塊大小合計1700KB左右(320 + 70 + 1370)。而Jackson jr的體積控制在了95KB(就算加上core模塊的320也不到500KB)。
而對於開發Java後臺的咱們對內存並不敏感,簡單易用、功能強大才是硬道理。所以jackson-jr
只是在此處作個簡單瞭解便可,本專欄後面也不會再說起。
漏洞報告
Jackson雖然已經足夠穩定而且安全了,但哪有聖人呢。針對它的相關漏洞報告,最近一次發生在2019-07-23
:FasterXML jackson-databind 遠程代碼執行(CVE-2019-12384)
更多、更新的詳細漏洞報告參考連接(持續更新中):知道創宇Jackson漏洞報告
Java JSON庫比較
市面上的JSON庫很是之多,綜合一些Java人員的意見,關於使用哪一個庫,這裏有一些現有的獨立比較的連接供以你參考:
- Top 7 Open-Source JSON-binding providers
- Be a Lazy but a Productive Android Developer, Part 3: JSON Parsing Library
- "Can anyone recommend a good Java JSON library" (Linked-In group)
- "Which JSON library to use on Android?"
說明:此處貼出的幾個參考連接均爲官網給出的參考文章,均爲國外較權威的文獻。
固然天朝的你可能更關心Jackson和Fastjson的對比,那暫先不用着急(雖然上文也比較過),這是本專欄後面的一道主菜,那裏會詳細道來。
總結
本文結合官網認識了Jackson的全貌,用全面的視角總體上把握到了Jackson所提供的功能模塊,這爲專欄後續的講解提供一個索引。
從Jackson的升級之快、模塊支持之多足矣看得見它社區的活躍。而且爲了迎合市場它在2.10
版本後還提供了商業支持的服務:與Tidelift公司合做,爲用戶構建應用程序的開源依賴項提供商業支持和維護。節省時間、下降風險和改善代碼健康情況(商業支持是收費的)。
相信經過本文你對Jackson有了個大概的瞭解,不出意外你應該是有興趣去學它了的。當你深刻研究後會發現它的設計之優雅,擴展性之強,不是通常國產類庫所能比擬的。若是說Fastjson是一個優秀的JSON庫,那麼Jackson就是一個更優秀的JSON生態。
PS:這是做者第一個付費專欄,專欄費用本想設置爲0.01元的,但CSDN官方有最低訂價限制,但願各位同仁予以理解。本專欄我會用心去撰寫,以確保能對得起您的這個付費。若您對本專欄有任何疑問,或者對Java很是感興趣,都可以私信我 or 左邊掃碼加我好友,一塊兒交流探討,共同進步~
本專欄在CSDN付費,在公衆號所有免費公開,歡迎你關注A哥的公衆號【BAT的烏托邦】