1. 初識Jackson -- 世界上最好的JSON庫

生命過短暫,不要去作一些根本沒有人想要的東西。本文已被 https://www.yourbatman.cn 收錄,裏面一併有Spring技術棧、MyBatis、JVM、中間件等小而美的專欄供以避免費學習。關注公衆號【BAT的烏托邦】逐個擊破,深刻掌握,html

前言

各位小夥伴你們好,我是A哥。上篇文章 【Fastjson到了說再見的時候了】 A哥跟Fastjson說了拜拜,從本系列開始,咱們將一塊兒進入Jackson庫的學習。固然嘍說它是世界上最好的JSON庫並不是一家之言,是官網上它本身說的,我免責申明哈。java

一個工程僅需一個JSON庫

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是世界最好的JSON庫

Jackson是一個簡單的、功能強大的、基於Java的應用庫。它能夠很方便完成Java對象Json對象(xml文檔or其它格式)進行互轉。Jackson社區相對比較活躍,更新速度也比較快。Jackson庫有以下幾大特性:web

  • 高性能且穩定:低內存佔用,對大/小JSON串,大/小對象的解析表現均很優秀
  • 流行度高:是不少流行框架的默認選擇
  • 容易使用:提供高層次的API,極大簡化了平常使用案例
  • 無需本身手動建立映射:內置了絕大部分序列化時和Java類型的映射關係
  • 乾淨的JSON:建立的JSON具備乾淨、緊湊、體積小等特色
  • 無三方依賴:僅依賴於JDK
  • Spring生態加持:jackson是Spring家族的默認JSON/XML解析器(明白了吧,學完此專欄你對Spring都能更親近些了,一箭雙鵰)

版本約定:本專欄統一使用的版本號固定爲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組織它直屬的一級工程其實也有很多:

  1. com.fasterxml.jackson
  2. com.fasterxml.uuid
  3. com.fasterxml.woodstox
  4. ...

很顯然,本專欄僅僅只會關注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分支,1.9.13。處於維護模式,只發布bug修復版本(最近一次發佈於Jul, 2013)
  • 2.x是正在開發的版本(持續更新升級中,2.0.0發佈於Mar, 2012)

注意:這兩個主要版本使用不一樣的Java包名和Maven GAV,所以它們並不相互兼容,但能夠和平共存。一個項目能夠同時依賴於這兩個版本是沒有衝突的。這是通過設計而爲之,選擇這種策略是爲了更順利地從1.x進行遷移2. x

說明:如今都2020年了,1.x能夠絕不客氣的說已經淘汰了(除了很是老的項目還在用),所以針對1.x版本本專欄不會有任何涉獵。

活躍的2.x分支說明

目前2.x分支存在以下活躍的分支們:

  • 2.12:下一個小版本,目前正在開發中
  • 2.11: 當前穩定版。積極維護的分支,會積極持續發佈補丁
  • 2.10:上一個穩定的分支,沒有中止維護仍會發布補丁
  • 2.9: 非活躍分支,只會發佈微補丁了,雖然還活躍但活躍度較低
  • 其它2.x分支:只會發佈重大安全補丁
  • master:主分支。下一個主要分支3.0正在快速開發中

說明:對於2.11.0和2.11.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時間API
    • jackson-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-23FasterXML jackson-databind 遠程代碼執行(CVE-2019-12384) 更多、更新的詳細漏洞報告參考連接(持續更新中):知道創宇Jackson漏洞報告


Java JSON庫比較

市面上的JSON庫很是之多,綜合一些Java人員的意見,關於使用哪一個庫,這裏有一些現有的獨立比較的連接供以你參考:

說明:此處貼出的幾個參考連接均爲官網給出的參考文章,均爲國外較權威的文獻。

固然天朝的你可能更關心Jackson和Fastjson的對比,那暫先不用着急(雖然上文也比較過),這是本專欄後面的一道主菜,那裏會詳細道來。


總結

本文結合官網認識了Jackson的全貌,用全面的視角總體上把握到了Jackson所提供的功能模塊,這爲專欄後續的講解提供一個索引。

從Jackson的升級之快、模塊支持之多足矣看得見它社區的活躍。而且爲了迎合市場它在2.10版本後還提供了商業支持的服務:與Tidelift公司合做,爲用戶構建應用程序的開源依賴項提供商業支持和維護。節省時間、下降風險和改善代碼健康情況(商業支持是收費的)。

相信經過本文你對Jackson有了個大概的瞭解,不出意外你應該是有興趣去學它了的。當你深刻研究後會發現它的設計之優雅,擴展性之強,不是通常國產類庫所能比擬的。若是說Fastjson是一個優秀的JSON庫,那麼Jackson就是一個更優秀的JSON生態。


本專欄在CSDN付費,在公衆號所有免費公開,歡迎你關注A哥的公衆號【BAT的烏托邦】


關注A哥

Author A哥(YourBatman)
我的站點 www.yourbatman.cn
E-mail yourbatman@qq.com
微 信 fsx641385712
活躍平臺
公衆號 BAT的烏托邦(ID:BAT-utopia)
知識星球 BAT的烏托邦
每日文章推薦 每日文章推薦
BAT的烏托邦
BAT的烏托邦
相關文章
相關標籤/搜索