溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Jackson的基礎(chǔ)核心用法有哪些

發(fā)布時(shí)間:2021-12-13 19:12:12 來源:億速云 閱讀:180 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了Jackson的基礎(chǔ)核心用法有哪些,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

Jackson是Spring Boot默認(rèn)的JSON數(shù)據(jù)處理框架,但是其并不依賴于任何的Spring 庫(kù)。有的小伙伴以為Jackson只能在Spring框架內(nèi)使用,其實(shí)不是的,沒有這種限制。它提供了很多的JSON數(shù)據(jù)處理方法、注解,也包括流式API、樹模型、數(shù)據(jù)綁定,以及復(fù)雜數(shù)據(jù)類型轉(zhuǎn)換等功能。它雖然簡(jiǎn)單易用,但絕對(duì)不是小玩具,下面為大家介紹Jackson的基礎(chǔ)核心用法

一、從URL讀取JSON數(shù)據(jù)

Jackson不僅可以將字符串反序列化為 Java POJO對(duì)象,還可以請(qǐng)求遠(yuǎn)程的API,獲得遠(yuǎn)程服務(wù)的JSON響應(yīng)結(jié)果,并將其轉(zhuǎn)換為Java POJO對(duì)象。

[@Test](https://my.oschina.net/azibug)
void testURL() throws IOException {

  URL url = new URL("https://jsonplaceholder.typicode.com/posts/1"); //遠(yuǎn)程服務(wù)URL
  ObjectMapper mapper = new ObjectMapper();
  //從URL獲取JSON響應(yīng)數(shù)據(jù),并反序列化為java 對(duì)象
  PostDTO postDTO = mapper.readValue(url, PostDTO.class); 

  System.out.println(postDTO);

}
  • jsonplaceholder.typicode.com 是一個(gè)免費(fèi)提供HTTP測(cè)試服務(wù)的網(wǎng)站,我們可以利用它進(jìn)行測(cè)試

  • 遠(yuǎn)程服務(wù)API返回結(jié)果是一個(gè)JSON字符串,一篇post稿件包含userId,id,title,content屬性

  • PostDTO 是我們自己定義的java 類,同樣包含userId,id,title,content成員變量

下文是控制臺(tái)打印輸出結(jié)果,postDTO的toString()方法輸出。

PostDTO(userId=1, id=1, title=sunt aut facere repellat provident occaecati excepturi optio reprehenderit, body=quia et suscipit
suscipit recusandae consequuntur expedita et cum
reprehenderit molestiae ut ut quas totam
nostrum rerum est autem sunt rem eveniet architecto)

二、Unknow Properties 賦值失敗處理

有的時(shí)候,客戶端提供的JSON字符串屬性,多于我們服務(wù)端定義的java 類的成員變量。

Jackson的基礎(chǔ)核心用法有哪些

比如上圖中的兩個(gè)類,

  • 我們先將PlayerStar序列化為JSON字符串,包含age屬性

  • 然后將JSON字符串轉(zhuǎn)換為PlayerStar2,不包含age屬性

[@Test](https://my.oschina.net/azibug)
void testUnknowProperties() throws IOException {
  ObjectMapper mapper = new ObjectMapper();
  PlayerStar player = PlayerStar.getInstance(); //為PlayerStar 各屬性賦值,可以參考本系列文章第一篇

  //將PlayerStar序列化為JSON字符串
  String jsonString = mapper.writeValueAsString(player);
  System.out.println(jsonString);
  //將JSON字符串反序列化為PlayerStar2對(duì)象
  PlayerStar2 player2 = mapper.readValue(jsonString, PlayerStar2.class);
  System.out.println(player2);
}

當(dāng)進(jìn)行反序列化的時(shí)候,會(huì)拋出下面的異常。這是因?yàn)镴SON字符串所包含的屬性,多余Java類的定義(多出一個(gè)阿age,賦值時(shí)找不到setAge方法)。

{"age":45,"playerName":"喬丹"}

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "age" (class com.example.demo.javabase.PlayerStar2), not marked as ignorable (one known property: "playerName"])
 at [Source: (String)"{"age":45,"playerName":"喬丹"}"; line: 1, column: 10] (through reference chain: com.example.demo.javabase.PlayerStar2["age"])

如果我們想忽略掉age屬性,不接受我們的java類未定義的成員變量數(shù)據(jù),可以使用下面的方法,就不會(huì)拋出UnrecognizedPropertyException了。

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

三、未賦值Java Bean序列化

有的時(shí)候,我們明知道某些類的數(shù)據(jù)可能為空,我們通常也不會(huì)為它賦值。但是客戶端就是需要這個(gè){}的JSON對(duì)象,我們?cè)撛趺醋觯?/p>

public class MyEmptyObject {
  private Integer i;  //沒有g(shù)et set方法
}

我們可以為ObjectMapper設(shè)置disable序列化特性:FAIL_ON_EMPTY_BEANS,也就是允許對(duì)象的所有屬性均未賦值。

[@Test](https://my.oschina.net/azibug)
void testEmpty() throws IOException {

  ObjectMapper mapper = new ObjectMapper();
  mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

  String jsonString = mapper.writeValueAsString(new MyEmptyObject());
  System.out.println(jsonString);

}

默認(rèn)情況下不做設(shè)置,會(huì)拋出下面的異常InvalidDefinitionException。設(shè)置disable序列化特性:FAIL_ON_EMPTY_BEANS之后,會(huì)序列化為{}字符串。

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.example.demo.jackson.JacksonTest1$MyEmptyObject and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

四、日期格式化

日期格式化,是我們JSON序列化與反序列化過程中比較常見的需求

ObjectMapper mapper = new ObjectMapper();
Map temp = new HashMap();
temp.put("now", new Date());
String s = mapper.writeValueAsString(temp);
System.out.println(s);

默認(rèn)情況下,針對(duì)java中的日期及相關(guān)類型,Jackson的序列化結(jié)果如下

{"now":1600564582571}

如果我們希望在JSON序列化及反序列化過程中,日期格式化,需要做如下的處理

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);  //注意這里
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));  //注意這里
Map temp = new HashMap();
temp.put("now", new Date());

String s = mapper.writeValueAsString(temp);
System.out.println(s);

控制臺(tái)打印輸出結(jié)果如下:

{"now":"2020-09-20"}

上述內(nèi)容就是Jackson的基礎(chǔ)核心用法有哪些,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI