日韩视频在线观看,日本中文字幕一区精品在线,国产交换配乱婬视频手机版,热re99久久精品国产99热

  • <sup id="fgl9g"></sup>
      <legend id="fgl9g"><abbr id="fgl9g"><thead id="fgl9g"></thead></abbr></legend>
      我要投稿 投訴建議

      Jackson的用法實(shí)例解釋

      時(shí)間:2021-05-12 12:34:40 語文百科 我要投稿

      Jackson的用法實(shí)例解釋

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

        一、簡(jiǎn)介

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

        下面,結(jié)合實(shí)例來對(duì)Jackson的用法進(jìn)行簡(jiǎn)單介紹。

        二、使用

        Jackson提供了很多類和方法,而在序列化和反序列化中使用的最多的類則是ObjectMapper這個(gè)類,此類比較類似于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()。下面將按照序列化和反序列化兩個(gè)方面來簡(jiǎn)單介紹用法。

        1.序列化

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

        測(cè)試?yán)?/p>

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

        實(shí)現(xiàn)序列化:

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

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

        [1,2,3]

        結(jié)論:

        Jackson對(duì)一般類型的序列化是能簡(jiǎn)單實(shí)現(xiàn)的。

       、趯(duì)自定義類的序列化

        測(cè)試?yán)樱?/p>

        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。

        實(shí)現(xiàn)序列化

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

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

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

        結(jié)論:

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

       、蹖(duì)時(shí)間格式的定義

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

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

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

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

        自定義時(shí)間格式的實(shí)現(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);

        控制臺(tái)上輸出的記過是:

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

        結(jié)論:

        可見時(shí)間輸出格式變成了我們想要的`了。在Jackson中定義時(shí)間輸出格式的方法比在Json-lib中對(duì)時(shí)間格式的定義簡(jiǎn)便很多。

       、 另一種序列化方法

        實(shí)現(xiàn)序列化

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

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

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

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

        結(jié)論:

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

        2. 反序列化

       、僖淮涡苑葱蛄谢

        此方法中主要利用ObjectMapper提供的readValue(String content, ClassvalueType)方法。此方法需要輸入Json串以及對(duì)應(yīng)的需要填充的類的Class,返回填充后的類。

        將Json串解析到自定義類中

        當(dāng)Json串為:

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

        的時(shí)候。

        首先自定義一個(gè)類:

        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)

        可以在控制臺(tái)上看到輸出的值為:

        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定義一個(gè)變量:Mapmaps。然后利用maps = objectMapper.readValue(json, Map.class)便可將Json反序列化到變量maps中。

        通過

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

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

        0{home=abc, mobile=def}

        ②漸次反序列化

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

        測(cè)試?yán)?/p>

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

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

        實(shí)現(xiàn)反序列化

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

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

        357504604.59802246094 305569.9150390625358504602.2680053711 305554.43603515625

        結(jié)論:

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

        三.總結(jié)

        Jackson關(guān)于Json的操作主要如上所示,其方法使用起來很便利,而且也很靈活,即提供了一次性完成的操作,也提供了可以按需讀取信息的操作。并且Jackson的功能很齊全,可以對(duì)序列化和反序列化進(jìn)行多種細(xì)節(jié)的控制,例如注解功能和對(duì)于Hibernate的延遲注入功能以及設(shè)置時(shí)間格式功能等,因?yàn)檫@些功能目前不太需要,所以仔細(xì)研究留待以后。同時(shí),Jackson還支持對(duì)XML的一系列序列化和反序列化的操作,其思路與解析Json的大致相同。

        對(duì)于Jackson目前的缺點(diǎn),網(wǎng)上有人測(cè)試所比Json-lib更占內(nèi)存一些。而利用空間換時(shí)間,一般是值得的。

      【Jackson的用法實(shí)例解釋】相關(guān)文章:

      胡同文化的教案實(shí)例04-13

      夢(mèng)見住宅的解釋05-21

      夢(mèng)見污泥的解釋10-26

      夢(mèng)見雛雞的解釋10-25

      夢(mèng)見爐子的解釋10-24

      夢(mèng)見鑿子的解釋10-24

      夢(mèng)見廢墟的解釋10-23

      夢(mèng)見罐子的解釋10-23

      夢(mèng)見陷阱的解釋10-23

      夢(mèng)見聲音的解釋10-23