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

Jackson的用法實例分析

 更新時間:2014年08月06日 09:17:21   投稿:shichen2014  
這篇文章主要介紹了Jackson的用法實例分析,用于處理Java的json格式數(shù)據(jù)非常實用,需要的朋友可以參考下

通俗的來說,Jackson是一個 Java 用來處理 JSON 格式數(shù)據(jù)的類庫,其性能非常好。本文就來針對Jackson的用法做一個較為詳細(xì)的實例分析。具體如下:

一、簡介

Jackson具有比較高的序列化和反序列化效率,據(jù)測試,無論是哪種形式的轉(zhuǎn)換,Jackson > Gson > Json-lib,而且Jackson的處理能力甚至高出Json-lib近10倍左右,且正確性也十分高。相比之下,Json-lib似乎已經(jīng)停止更新,最新的版本也是基于JDK15,而Jackson的社區(qū)則較為活躍。
下面,結(jié)合實例來對Jackson的用法進(jìn)行簡單介紹。

二、使用

Jackson提供了很多類和方法,而在序列化和反序列化中使用的最多的類則是ObjectMapper這個類,此類比較類似于Json-lib中JsonObject和ArrayObject。此類中提供了readTree(),readValue(),writeValueAsString()等方法用于轉(zhuǎn)換。具體關(guān)于此類的說明文檔地址是:http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html。

為了避免重復(fù)描述,下面中所涉及到的objectMapper均是來至于ObjectMapper objectMapper = new ObjectMapper()。下面將按照序列化和反序列化兩個方面來簡單介紹用法。

1.序列化

① 對java自帶類進(jìn)行序列化

測試?yán)?br />

List list=new ArrayList();
list.add(1);
list.add(2);
list.add(3);

實現(xiàn)序列化:

String teststringlist=objectMapper.writeValueAsString(list);
System.out.println(teststringlist);

在控制臺輸出的結(jié)果是:

[1,2,3]

結(jié)論:

Jackson對一般類型的序列化是能簡單實現(xiàn)的

②對自定義類的序列化

測試?yán)樱?br />

public class student {
private int age=10;
private String name="hhh"; 
  public String[] list={"hao","haouhao","keyi"};
  public Date time=new Date();
     public int getAge() {
          return age;
     }
     public void setAge(int age) {
          this.age = age;
     }
     public String getName() {
          return name;
     }
     public void setName(String name) {
          this.name = name;
     }
}

為使例子更具有通用性,此類中包含了值類型int,引用類型String,String[],還包含了日期類型Date。
實現(xiàn)序列化

student st=new student();
String teststringstu=objectMapper.writeValueAsString(st);
System.out.println(teststringstu);

在控制臺輸出的結(jié)果是:

{"list":["hao","haouhao","keyi"],"time":1375429228382,"name":"hhh","age":10}

結(jié)論:

通過輸出,可見轉(zhuǎn)換得到的Json串是符合格式的。但是,時間的表示有點不符合標(biāo)準(zhǔn)。下面將介紹對時間格式的修改。

③對時間格式的定義

Jackson有自己的默認(rèn)時間格式,即timestamps形式,其效果即如上結(jié)果所顯示的(例如:1375429228382)。如果想設(shè)置此格式是無效,通過

objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false)

便可設(shè)置,這樣將使時間生成使用所謂的使用 [ISO-8601 ]-compliant notation, 輸出類似如下格式的時間: "1970-01-01T00:00:00.000+0000"。

當(dāng)然,也可以自定義輸出的時間格式。

自定義時間格式的實現(xiàn)

例子還采用上面所介紹的student類。

student st=new student();
java.text.DateFormat myFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
objectMapper.getSerializationConfig().setDateFormat(myFormat);
String teststringstu=objectMapper.writeValueAsString(st);
System.out.println(teststringstu);

控制臺上輸出的記過是:

{"list":["hao","haouhao","keyi"],"time":"2013-08-02 03:48:20","name":"hhh","age":10}

結(jié)論:

可見時間輸出格式變成了我們想要的了。在Jackson中定義時間輸出格式的方法比在Json-lib中對時間格式的定義簡便很多。

④ 另一種序列化方法

實現(xiàn)序列化

所用例子依然是之前的student類。

student st=new student();
JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);
jsonGenerator.writeObject(st); 
System.out.println();

控制臺上的輸出結(jié)果是:

{"list":["hao","haouhao","keyi"],"time":1375429228382,"name":"hhh","age":10}

結(jié)論:

此方法同樣可以得到上面方法的值。但是注意此方法中的這個函數(shù):createJsonGenerator(),它需要兩個參數(shù),一個是OutputStream類型參數(shù),一個是JsonEncoding類型參數(shù)。通過這兩個參數(shù),我們可以了解到,此方法不僅可以將Json直接寫入網(wǎng)絡(luò)流,還可以將Json寫入文件流或者內(nèi)存流。所以用途更廣。

2. 反序列化

①一次性反序列化

此方法中主要利用ObjectMapper提供的<testJsonClass> readValue(String content, Class<testJsonClass> valueType)方法。此方法需要輸入Json串以及對應(yīng)的需要填充的類的Class,返回填充后的類。
將Json串解析到自定義類中

當(dāng)Json串為:

String test1="{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]}"

的時候。

首先自定義一個類:

public class testJsonClass
 {
    public int objectID;
    public List geoPoints=new ArrayList();
}

然后利用下面段代碼將Json反序列化到此類中:

testJsonClass testClass= objectMapper.readValue(test1, testJsonClass.class);

利用

System.out.println(testClass.objectID);
System.out.println(testClass.geoPoints)

可以在控制臺上看到輸出的值為:

357
[{x=504604.59802246094, y=305569.9150390625}]

將Json串反序列化到系統(tǒng)自帶的類中
當(dāng)Json串是

String json = "{"error":0,"data":{"name":"ABC","age":20,"phone":{"home":"abc","mobile":"def"},"friends":[{"name":"DEF","phone":{"home":"hij","mobile":"klm"}},{"name":"GHI","phone":{"home":"nop","mobile":"qrs"}}]},"other":{"nickname":[]}}"。

用系統(tǒng)自帶的Map定義一個變量:Map<String, Map<String, Object>>  maps。然后利用maps = objectMapper.readValue(json, Map.class)便可將Json反序列化到變量maps中。
通過

System.out.println(maps.get("error"));
System.out.println((Object)(maps.get("data").get("phone")))

可在控制臺中得到下面的結(jié)果:

0
{home=abc, mobile=def}

②漸次反序列化

此方法更靈活,可以只將用戶感興趣的Json串信息值提取出來。主要利用ObjectMapper提供的readTree和Jackson提供的JsonNode類來實現(xiàn)。

測試?yán)?br />

String test="{"results":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";

此Json串比較復(fù)雜,包含了嵌套數(shù)組的形式,具有通用性。

實現(xiàn)反序列化

JsonNode node= objectMapper.readTree(test);   //將Json串以樹狀結(jié)構(gòu)讀入內(nèi)存
JsonNode contents=node.get("results");//得到results這個節(jié)點下的信息
for(int i=0;i<contents.size();i++) //遍歷results下的信息,size()函數(shù)可以得節(jié)點所包含的的信息的個數(shù),類似于數(shù)組的長度
{
System.out.println(contents.get(i).get("objectID").getIntValue()); //讀取節(jié)點下的某個子節(jié)點的值
JsonNode geoNumber=contents.get(i).get("geoPoints");
for(int j=0;j<geoNumber.size();j++)   //循環(huán)遍歷子節(jié)點下的信息
{
System.out.println(geoNumber.get(j).get("x").getDoubleValue()+" "+geoNumber.get(j).get("y").getDoubleValue());
}
}

在控制臺下輸出的結(jié)果是:

357
504604.59802246094 305569.9150390625
358
504602.2680053711 305554.43603515625

結(jié)論:

此方法類似于XML解析中的DOM方式解析,其好處是結(jié)構(gòu)明細(xì),便于提取想要的信息。當(dāng)然,其缺點也和此方法一樣:耗時費空間。

三.總結(jié)

Jackson關(guān)于Json的操作主要如上所示,其方法使用起來很便利,而且也很靈活,即提供了一次性完成的操作,也提供了可以按需讀取信息的操作。并且Jackson的功能很齊全,可以對序列化和反序列化進(jìn)行多種細(xì)節(jié)的控制,例如注解功能和對于Hibernate的延遲注入功能以及設(shè)置時間格式功能等,因為這些功能目前不太需要,所以仔細(xì)研究留待以后。同時,Jackson還支持對XML的一系列序列化和反序列化的操作,其思路與解析Json的大致相同。
對于Jackson目前的缺點,網(wǎng)上有人測試所比Json-lib更占內(nèi)存一些。而利用空間換時間,一般是值得的。

相關(guān)文章

  • 詳解一個簡單的Servlet容器的設(shè)計與實現(xiàn)

    詳解一個簡單的Servlet容器的設(shè)計與實現(xiàn)

    Servlet算是Java Web開發(fā)請求鏈路調(diào)用棧中底層的一個技術(shù),而了解一個Servlet容器的實現(xiàn)有助于更好的理解JavaWeb開發(fā),所以下面就來看看如何設(shè)計與實現(xiàn)一個簡單的Servlet容器吧
    2023-07-07
  • Spring?Boot整合流控組件Sentinel的場景分析

    Spring?Boot整合流控組件Sentinel的場景分析

    Sentinel?提供簡單易用、完善的?SPI?擴(kuò)展接口。您可以通過實現(xiàn)擴(kuò)展接口來快速地定制邏輯,這篇文章主要介紹了Spring?Boot整合流控組件Sentinel的過程解析,需要的朋友可以參考下
    2021-12-12
  • Java?Web項目中解決中文亂碼方法總結(jié)(三種最新方法)

    Java?Web項目中解決中文亂碼方法總結(jié)(三種最新方法)

    這篇文章主要介紹了Java?Web項目中解決中文亂碼方法總結(jié),本文給大家分享三種最新解決方法,需要的朋友可以參考下
    2022-06-06
  • Spring?Boot中調(diào)用外部接口的3種方式步驟

    Spring?Boot中調(diào)用外部接口的3種方式步驟

    這篇文章主要給大家介紹了關(guān)于Spring?Boot中調(diào)用外部接口的3種方式步驟,在Spring-Boot項目開發(fā)中,存在著本模塊的代碼需要訪問外面模塊接口,或外部url鏈接的需求,需要的朋友可以參考下
    2023-08-08
  • Java中Lock鎖基本使用方法詳解

    Java中Lock鎖基本使用方法詳解

    鎖是一種工具,用于控制對共享資源的訪問Lock和synchronized是最常見的兩個鎖,他們都能夠達(dá)到線程安全的目錄,這篇文章主要給大家介紹了關(guān)于Java中Lock鎖基本使用方法詳解的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 下一代Eclipse 步入云端

    下一代Eclipse 步入云端

    代號Che的下一代Eclipse IDE將運行在云端,可以在任何機(jī)器上打開瀏覽器寫代碼。項目的建立、編輯、debug、部署可以都在一個倉庫中進(jìn)行,需要的朋友可以參考下
    2015-12-12
  • 基于Java快速實現(xiàn)一個簡單版的HashMap詳解

    基于Java快速實現(xiàn)一個簡單版的HashMap詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Java簡單實現(xiàn)一個底層數(shù)據(jù)結(jié)構(gòu)為數(shù)組?+?鏈表的HashMap,不考慮鏈表長度超過8個時變?yōu)榧t黑樹的情況,需要的可以參考一下
    2023-02-02
  • java CompletableFuture實現(xiàn)異步編排詳解

    java CompletableFuture實現(xiàn)異步編排詳解

    這篇文章主要為大家介紹了java CompletableFuture實現(xiàn)異步編排詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • SpringBoot文件上傳與下載功能實現(xiàn)詳解

    SpringBoot文件上傳與下載功能實現(xiàn)詳解

    文件上傳與下載是Web應(yīng)用開發(fā)中常用的功能之一。接下來我們將討論如何在Spring?Boot的Web應(yīng)用開發(fā)中,如何實現(xiàn)文件的上傳與下載,感興趣的可以了解一下
    2022-10-10
  • Java模板方法模式定義算法框架

    Java模板方法模式定義算法框架

    Java模板方法模式是一種行為型設(shè)計模式,它定義了一個算法框架,由抽象父類定義算法的基本結(jié)構(gòu),具體實現(xiàn)細(xì)節(jié)由子類來實現(xiàn),從而實現(xiàn)代碼復(fù)用和擴(kuò)展性
    2023-05-05

最新評論