詳解Jackson 使用以及性能介紹
直接上代碼,看下最簡單也是最常用的方法,將Object 轉(zhuǎn)為 JSON 以及將Json轉(zhuǎn)為Object方式
public class TestJackson { public static void main(String[] args) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); Map<String,Object> params = new HashMap<>(); params.put("name","jack"); params.put("age",18); //將對(duì)象轉(zhuǎn)為JSON串 String jsonString = objectMapper.writeValueAsString(params); System.out.println(jsonString); System.out.println("--------------------分割線-----------------------------"); //將JSON串 轉(zhuǎn)為 Object 對(duì)象 Map resultMap = objectMapper.readValue(jsonString, HashMap.class); resultMap.entrySet().stream().forEach(entry ->{ System.out.println(entry); }); } }
如果你只是忘了怎么操作,或者只是想知道怎么對(duì)象和JSON串如何相互轉(zhuǎn),那么你看到這就足夠了,如果你想了解更多關(guān)于Jackson,以及Jackson與fastJson等的對(duì)比,那么可以往下看。
介紹
Jackson 是當(dāng)前用的比較廣泛的,用來序列化和反序列化 json 的 Java 的開源框架。Jackson 社 區(qū)相對(duì)比較活躍,更新速度也比較快, 從 Github 中的統(tǒng)計(jì)來看,Jackson 是最流行的 json 解析器之一 。 Spring MVC 的默認(rèn) json 解析器便是 Jackson。 Jackson 優(yōu)點(diǎn)很多。 Jackson 所依賴的 jar 包較少 ,簡單易用。與其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比較快;Jackson 運(yùn)行時(shí)占用內(nèi)存比較低,性能比較好;Jackson 有靈活的 API,可以很容易進(jìn)行擴(kuò)展和定制。
Jackson 的 1.x 版本的包名是 org.codehaus.jackson ,當(dāng)升級(jí)到 2.x 版本時(shí),包名變?yōu)?com.fasterxml.jackson,本文討論的內(nèi)容是基于最新的 Jackson 的 2.9.1 版本。
組件
- jackson-core,核心包,提供基于"流模式"解析的相關(guān) API,它包括 JsonPaser 和 JsonGenerator。 Jackson 內(nèi)部實(shí)現(xiàn)正是通過高性能的流模式 API 的 JsonGenerator 和 JsonParser 來生成和解析 json。
- jackson-annotations,注解包,提供標(biāo)準(zhǔn)注解功能;
- jackson-databind ,數(shù)據(jù)綁定包, 提供基于"對(duì)象綁定" 解析的相關(guān) API ( ObjectMapper ) 和"樹模型" 解析的相關(guān) API (JsonNode);基于"對(duì)象綁定" 解析的 API 和"樹模型"解析的 API 依賴基于"流模式"解析的 API。
pom依賴
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.5</version> </dependency>
jackson-databind 依賴 jackson-core 和 jackson-annotations,當(dāng)添加 jackson-databind 之后, jackson-core 和 jackson-annotations 也隨之添加到 Java 項(xiàng)目工程中。在添加相關(guān)依賴包之后,就可以使用 Jackson。
信息配置
在調(diào)用 writeValue 或調(diào)用 readValue 方法之前,往往需要設(shè)置 ObjectMapper 的相關(guān)配置信息。這些配置信息應(yīng)用 java 對(duì)象的所有屬性上
//在反序列化時(shí)忽略在 json 中存在但 Java 對(duì)象不存在的屬性 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //在序列化時(shí)日期格式默認(rèn)為 yyyy-MM-dd'T'HH:mm:ss.SSSZ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false); //在序列化時(shí)忽略值為 null 的屬性 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //忽略值為默認(rèn)值的屬性 objectMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_DEFAULT);
更多配置信息可以查看 Jackson 的 DeserializationFeature,SerializationFeature 和 I nclude。
注解使用
Jack還提供了注解方式的使用
注解 | 用法 |
---|---|
@JsonProperty | 用于屬性,把屬性的名稱序列化時(shí)轉(zhuǎn)換為另外一個(gè)名稱。示例: @JsonProperty("birth_ d ate") private Date birthDate; |
@JsonFormat | 用于屬性或者方法,把屬性的格式序列化時(shí)轉(zhuǎn)換成指定的格式。示例: @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm") public Date getBirthDate() |
@JsonPropertyOrder | 用于類, 指定屬性在序列化時(shí) json 中的順序 , 示例: @JsonPropertyOrder({ "birth_Date", "name" }) public class Person |
@JsonCreator | 用于構(gòu)造方法,和 @JsonProperty 配合使用,適用有參數(shù)的構(gòu)造方法。 示例: @JsonCreator public Person(@JsonProperty("name")String name) {…} |
@JsonAnySetter | 用于屬性或者方法,設(shè)置未反序列化的屬性名和值作為鍵值存儲(chǔ)到 map 中 @JsonAnySetter public void set(String key, Object value) { map.put(key, value); } |
@JsonAnyGetter | 用于方法 ,獲取所有未序列化的屬性 public Map<String, Object> any() { return map; } |
public class TestJackson { public static void main(String[] args) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); //將對(duì)象轉(zhuǎn)為JSON串 String jsonString = objectMapper.writeValueAsString(new User()); System.out.println(jsonString); } } class User { @JsonProperty("name") private String aaa = "hello"; @JsonProperty("date") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date bbb = new Date(); ...省略setter 和 getter... }
讀取對(duì)象轉(zhuǎn)換 還可以從 Reader ,File,URL,以及InputStream,字節(jié)數(shù)組中等 中獲取對(duì)象數(shù)據(jù),喜歡的可以自己研究下
那么性能如何呢?
對(duì)比對(duì)象選擇應(yīng)用最廣泛的Jackson和Google出品的Gson。測(cè)試環(huán)境選擇JDK 8,AMD 3700X,3200MHZ內(nèi)存。簡化實(shí)驗(yàn),只測(cè)試簡單對(duì)象和復(fù)雜對(duì)象的String轉(zhuǎn)對(duì)象、對(duì)象轉(zhuǎn)String,調(diào)用1千萬次的對(duì)比結(jié)果如下(時(shí)間單位是毫秒):
從測(cè)試結(jié)果看,F(xiàn)astJson確實(shí)是最快的,但僅比Jackson快20%左右,Google的Gson是最慢的,差距較大。讀到這里,是不是覺得選擇FastJson肯定沒錯(cuò)啊!但其實(shí),F(xiàn)astJson在國際上并不是很流行,反而Jackson很流行,難道其他人傻?當(dāng)然不是,因?yàn)镕astjson這兩年頻頻被曝出高危漏洞,這也是早已埋下的伏筆,因?yàn)镕astJson為了追求快,舍棄了很多方面,比如失去了元貝應(yīng)該兼容的java特性,對(duì)json標(biāo)準(zhǔn)遵循也不嚴(yán)格,總體來說,fastjson是一個(gè)代碼質(zhì)量較差的國產(chǎn)類庫,當(dāng)然它也在不斷的提升改變,也希望它繼續(xù)堅(jiān)持。
如果面試官問為什么選擇FastJson?因?yàn)榭?!這一個(gè)理由就可以把他頂回去了。
這里的調(diào)查研究并不是很充分,沒有對(duì)內(nèi)存占用、大文檔的測(cè)試。
在現(xiàn)代應(yīng)用程序中,即使最慢的Gson,也是滿足需求的;解析文檔速度的快慢,并不能作為選型的唯一標(biāo)準(zhǔn),可能連主要標(biāo)準(zhǔn)都算不上。對(duì)IO優(yōu)化,并行處理等優(yōu)化措施,比選用一個(gè)更快的庫更有效。
所以整體上來說Jackson 綜合評(píng)價(jià)應(yīng)該是很不錯(cuò)的。
到此這篇關(guān)于詳解Jackson 使用以及性能介紹的文章就介紹到這了,更多相關(guān)Jackson 使用及性能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)教程之八大基本數(shù)據(jù)類型
這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)教程之八大基本數(shù)據(jù)類型的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06SpringBoot+WebSocket向前端推送消息的實(shí)現(xiàn)示例
WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,允許服務(wù)器主動(dòng)向客戶端推送信息,同時(shí)也能從客戶端接收信息,本文主要介紹了SpringBoot+WebSocket向前端推送消息的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-08-08Spring Cloud Alibaba和Dubbo融合實(shí)現(xiàn)
這篇文章主要介紹了Spring Cloud Alibaba和Dubbo融合實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Feign 集成 Hystrix實(shí)現(xiàn)不同的調(diào)用接口不同的設(shè)置方式
這篇文章主要介紹了Feign 集成 Hystrix實(shí)現(xiàn)不同的調(diào)用接口不同的設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(55)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-08-08SpringBoot項(xiàng)目在IntelliJ IDEA中如何實(shí)現(xiàn)熱部署
spring-boot-devtools是一個(gè)為開發(fā)者服務(wù)的一個(gè)模塊,其中最重要的功能就是自動(dòng)應(yīng)用代碼更改到最新的App上面去。,這篇文章主要介紹了SpringBoot項(xiàng)目在IntelliJ IDEA中如何實(shí)現(xiàn)熱部署,感興趣的小伙伴們可以參考一下2018-07-07SpringBoot定制三種錯(cuò)誤頁面及錯(cuò)誤數(shù)據(jù)方法示例
Spring Boot提供的默認(rèn)異常處理機(jī)制通常并不一定適合我們實(shí)際的業(yè)務(wù)場(chǎng)景,因此,我們通常會(huì)根據(jù)自身的需要對(duì)Spring Boot全局異常進(jìn)行統(tǒng)一定制,例如定制錯(cuò)誤頁面,定制錯(cuò)誤數(shù)據(jù)等。本文主要介紹了SpringBoot三種自定義錯(cuò)誤頁面的實(shí)現(xiàn),快來學(xué)習(xí)吧2021-12-12