欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Jackson 使用以及性能介紹

 更新時(shí)間:2021年01月11日 14:10:49   作者:妖四靈.Shuen  
這篇文章主要介紹了詳解Jackson 使用以及性能介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

直接上代碼,看下最簡單也是最常用的方法,將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ù)類型

    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-06
  • java中l(wèi)ambda表達(dá)式語法說明

    java中l(wèi)ambda表達(dá)式語法說明

    “Lambda 表達(dá)式”(lambda expression)是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名,直接對(duì)應(yīng)于其中的lambda抽象(lambda abstraction),是一個(gè)匿名函數(shù),即沒有函數(shù)名的函數(shù)。Lambda表達(dá)式可以表示閉包(注意和數(shù)學(xué)傳統(tǒng)意義上的不同)。
    2016-09-09
  • SpringBoot+WebSocket向前端推送消息的實(shí)現(xiàn)示例

    SpringBoot+WebSocket向前端推送消息的實(shí)現(xiàn)示例

    WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,允許服務(wù)器主動(dòng)向客戶端推送信息,同時(shí)也能從客戶端接收信息,本文主要介紹了SpringBoot+WebSocket向前端推送消息的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-08-08
  • Spring Cloud Alibaba和Dubbo融合實(shí)現(xiàn)

    Spring Cloud Alibaba和Dubbo融合實(shí)現(xiàn)

    這篇文章主要介紹了Spring Cloud Alibaba和Dubbo融合實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Feign 集成 Hystrix實(shí)現(xiàn)不同的調(diào)用接口不同的設(shè)置方式

    Feign 集成 Hystrix實(shí)現(xiàn)不同的調(diào)用接口不同的設(shè)置方式

    這篇文章主要介紹了Feign 集成 Hystrix實(shí)現(xiàn)不同的調(diào)用接口不同的設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(55)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(55)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08
  • SpringBoot項(xiàng)目在IntelliJ IDEA中如何實(shí)現(xiàn)熱部署

    SpringBoot項(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-07
  • 使用Java操作TensorFlow的方法

    使用Java操作TensorFlow的方法

    TensorFlow是一個(gè)功能強(qiáng)大且廣泛使用的框架,它不斷得到改進(jìn),并最近被引入新語言包括Java和JavaScript,這篇文章主要介紹了如何使用Java操作TensorFlow,需要的朋友可以參考下
    2023-05-05
  • 深度解析Java中CountDownLatch的原理

    深度解析Java中CountDownLatch的原理

    在高并發(fā)編程中,AbstractQueuedSynchronizer(簡稱AQS)抽象的隊(duì)列同步器是我們必須掌握的,本文將通過CountDownLatch底層實(shí)現(xiàn)原理來了解AQS共享鎖模式的實(shí)現(xiàn)原理,快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • SpringBoot定制三種錯(cuò)誤頁面及錯(cuò)誤數(shù)據(jù)方法示例

    SpringBoot定制三種錯(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

最新評(píng)論