❝生命過短暫,不要去作一些根本沒有人想要的東西。本文已被 「https://www.yourbatman.cn」 收錄,裏面一併有Spring技術棧、MyBatis、JVM、中間件等小而美的「專欄」供以避免費學習。關注公衆號【「BAT的烏托邦」】逐個擊破,深刻掌握,html
❞
各位小夥伴你們好,我是A哥。上篇文章 【Fastjson到了說再見的時候了】 A哥跟Fastjson說了拜拜,從本系列開始,咱們將一塊兒進入Jackson庫的學習。固然嘍說它是世界上最好的JSON庫並不是一家之言,是官網上它本身說的,我免責申明哈。java
Java的JSON庫,你「至少」應該用過/聽過這三種:Jackson、Gson、Fastjson
。一個獨立的工程,按照依賴最少原則,本應該only one JSON庫是足矣的。但現狀是:各位同仁可觀察觀察各自的項目,大都同時存在2種JSON庫,亦或者3種甚至更多...android
❝說明:在「同一個工程內」,同一功能如有多種實現,實屬很差的現象。這會讓管理起來顯得混亂(譬如對日期的格式化就不方便作到統一),出口如有多個,想收口時就是個大難題了git
❞
做爲一個「合格的」架構師/工程師,保持最簡依賴(一致性依賴)是應該有的技術範,由於簡單一致性它能帶來很大的收益,道理很簡單:兩個Java程序員的溝通/協同效率,必定會比1個Java + 1個Python溝通效率高。程序員
so what,咱們應該選擇哪種JSON庫呢?答案顯而易見,那即是Jackson。由於它各個方面表現均很是優秀,是世界最流行、最好的JSON庫。把Jackson
做爲工程惟一JSON庫是有一丟丟門檻的(想一想你爲什麼使用Fastjson就知道啦),因此它來啦,祝你跨越此門檻,規範化使用,「助你增長一項主流的硬核實力,這也是本專欄的最大意義所在」。github
Jackson是一個簡單的、功能強大的、基於Java的「應用庫」。它能夠很方便完成「Java對象」和「Json對象」(xml文檔or其它格式)進行互轉。Jackson社區相對比較活躍,更新速度也比較快。Jackson庫有以下幾大特性:web
版本約定:本專欄統一使用的版本號固定爲2.11.0
(2020-04發佈),GAV以下:json
<dependency>
<groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.11.1</version> </dependency> 複製代碼
爲了保持版本的統一性,後續的Spring Boot(2.3.0.RELEASE)/Spring Framework(5.2.6.RELEASE)
使用的均爲當前最新版本,由於它內置的jackson也剛好就是本專欄講解的版本。segmentfault
細心的朋友從上面的groupId
裏能夠看到:jackson
它隸屬於fasterxml
這個組織。本着追本溯源的精神,能夠稍微的瞭解瞭解這個組織:fasterxml官網 截圖以下安全
簡單翻譯:FasterXML是Woodstox流的XML解析器、Jackson流的JSON解析器、Aalto非阻塞XML解析器以及「不斷增加」的實用程序庫和擴展家族背後的業務。
做爲一個高度流行的開源庫,這種官網頁面應該刷新了你的認知吧。並非它內容很少,而實際上是它的詳細介紹都發布在github
上了,這即是接下來咱們來認識它的主要渠道。
❝這種作法貌似已經成爲了一種流行的趨勢:愈來愈多的開源軟件傾向於把github做爲他們的Home Page了
❞
fasterxml
組織它「直屬的一級工程」其實也有很多:
很顯然,「本專欄僅僅只會關注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等數據格式,甚至還支持大數據格式模塊的設置。
Jackson有兩個主要的分支:
注意:這兩個主要版本使用「不一樣的Java包名」和Maven GAV,所以它們並不相互兼容,「但能夠和平共存」。一個項目能夠同時依賴於這兩個版本是沒有衝突的。這是通過設計而爲之,選擇這種策略是爲了更順利地從1.x進行遷移2. x
❝說明:如今都2020年了,1.x能夠絕不客氣的說已經淘汰了(除了很是老的項目還在用),所以針對1.x版本本專欄不會有任何涉獵。
❞
目前2.x分支存在以下活躍的分支們:
❝說明:對於2.11.0和2.11.x這種小分支之間的區別,能夠忽略
❞
Jackson是個開源的、且開放的社區。下面列出的大多數項目/模塊是由Jackson開發團隊「領導的」,但也有一些來自Jackson社區的成員
「core module(核心模塊) 是擴展模塊構建的基礎」。Jackson目前有3個核心模塊:
❝說明:核心模塊的groupId均爲:
❞<groupId>com.fasterxml.jackson.core</groupId>
,artifactId見下面各模塊所示
jackson-core
):定義底層處理流的API:JsonPaser和JsonGenerator等,幷包含
「特定於json」的實現。
jackson-annotations
):包含標準的Jackson註解
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>
,且版本號是和主版本號保持一致的
jackson-module-parameter-names
:此模塊可以訪問構造函數和方法參數的名稱,從而容許省略
@JsonProperty
(固然前提是你必須加了編譯參數:
-parameters
)
jackson-datatype-jsr310
:支持Java8新增的JSR310時間API
jackson-datatype-jdk8
:除了Java8的時間API外其它的API的支持,如
Optional
「非官方直接維護:」
❝說明:非官方直接維護的這些模塊groupId是不定的,每一個模塊可能都不同,而且它們的版本號不會隨着官方的主版本號一塊兒走
❞
javax.money
json-lib
這個庫的支持
Data format modules(數據格式模塊)提供對「JSON以外」的數據格式的支持。它們中的大多數只是實現streaming API抽象,以便數據綁定組件能夠按原樣使用。
「官方直接維護:」
❝說明:這些數據格式的模塊的groupId均爲
❞<groupId>com.fasterxml.jackson.dataformat</groupId>
,且跟着主版本號走
<artifactId>jackson-dataformat-[FORMAT]</artifactId>
「非官方直接維護:」 因非官方直接維護的模塊過於偏門,所以省略
官網有說,Jackson是一個「JVM平臺」的解析器,所以語言層面不侷限於Java自己,還涵蓋了另外兩大主流JVM語言:Kotlin和Scala
❝說明:這塊的groupId均爲:
❞<groupId>com.fasterxml.jackson.module</groupId>
,版本號跟着主版本號走
Jackson註解爲POJO定義了預期的屬性和預期的處理,除了Jackson自己將其用於讀取/寫入JSON和其餘格式以外,它還容許生成「外部模式」。上面已講述的數據格式擴展中包含了部分功能,但也仍還有許多獨立的模式工具,如:
❝說明:本部分因實際應用場景實在太少,爲了避免要混淆主要內容,此部分後面亦不會再說起
❞
雖然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漏洞報告
市面上的JSON庫很是之多,綜合一些Java人員的意見,關於使用哪一個庫,這裏有一些現有的獨立比較的連接供以你參考:
說明:此處貼出的幾個參考連接均爲官網給出的參考文章,均爲國外較權威的文獻。
固然天朝的你可能更關心Jackson和Fastjson的對比,那暫先不用着急(雖然上文也比較過),這是本專欄後面的一道主菜,那裏會詳細道來。
本文結合官網認識了Jackson的全貌,用全面的視角總體上把握到了Jackson所提供的功能模塊,這爲專欄後續的講解提供一個索引。
從Jackson的「升級之快、模塊支持之多」足矣看得見它社區的活躍。而且爲了迎合市場它在2.10
版本後還提供了商業支持的服務:與Tidelift公司合做,爲用戶構建應用程序的開源依賴項提供商業支持和維護。節省時間、下降風險和改善代碼健康情況(商業支持是收費的)。
相信經過本文你對Jackson有了個大概的瞭解,不出意外你應該是有興趣去學它了的。當你深刻研究後會發現它的「設計之優雅,擴展性之強」,不是通常國產類庫所能比擬的。若是說Fastjson是一個優秀的JSON庫,那麼Jackson就是一個更優秀的JSON生態。
「本專欄在CSDN付費,在公衆號所有免費公開,歡迎你關注A哥的公衆號【BAT的烏托邦】」
Author | A哥(YourBatman) |
---|---|
我的站點 | www.yourbatman.cn |
yourbatman@qq.com | |
「微 信」 | fsx641385712 |
「活躍平臺 」 |
|
「公衆號」 | BAT的烏托邦(ID:BAT-utopia) |
知識星球 | BAT的烏托邦 |
每日文章推薦 | 每日文章推薦 |