亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Jackson的用法實例分析

2019-11-26 15:27:37
字體:
來源:轉載
供稿:網友

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

一、簡介

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

二、使用

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

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

1.序列化

① 對java自帶類進行序列化

測試例子

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

實現序列化:

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

在控制臺輸出的結果是:

[1,2,3]

結論:

Jackson對一般類型的序列化是能簡單實現的

②對自定義類的序列化

測試例子:

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。
實現序列化

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

在控制臺輸出的結果是:

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

結論:

通過輸出,可見轉換得到的Json串是符合格式的。但是,時間的表示有點不符合標準。下面將介紹對時間格式的修改。

③對時間格式的定義

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

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

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

當然,也可以自定義輸出的時間格式。

自定義時間格式的實現

例子還采用上面所介紹的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}

結論:

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

④ 另一種序列化方法

實現序列化

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

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

控制臺上的輸出結果是:

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

結論:

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

2. 反序列化

①一次性反序列化

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

當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串反序列化到系統自帶的類中
當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":[]}}"。

用系統自帶的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")))

可在控制臺中得到下面的結果:

0{home=abc, mobile=def}

②漸次反序列化

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

測試例子

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

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

實現反序列化

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

在控制臺下輸出的結果是:

357504604.59802246094 305569.9150390625358504602.2680053711 305554.43603515625

結論:

此方法類似于XML解析中的DOM方式解析,其好處是結構明細,便于提取想要的信息。當然,其缺點也和此方法一樣:耗時費空間。

三.總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产亚洲| 91精品免费看| 国外视频精品毛片| 91高清视频免费观看| 欧美亚洲另类激情另类| 久久亚洲精品小早川怜子66| 亚洲国产婷婷香蕉久久久久久| 色诱女教师一区二区三区| 亚洲男女自偷自拍图片另类| 欧美成人精品影院| 日韩中文字幕精品视频| 懂色av一区二区三区| 国产精品女主播视频| 三级精品视频久久久久| 亚洲一区二区少妇| 在线日韩第一页| 国产免费一区视频观看免费| 国产91精品黑色丝袜高跟鞋| 亚洲字幕在线观看| 国内外成人免费激情在线视频网站| 国产精品福利在线观看网址| 日韩av在线网址| 欧美精品久久久久久久| 欧美精品在线观看91| 国产va免费精品高清在线观看| 国产欧美日韩免费| 亚洲日本中文字幕| 亚洲va欧美va在线观看| 欧美日韩成人黄色| 国产精品久久久久久久美男| 日韩精品极品视频免费观看| 国产精品久久久久久久久久小说| 亚洲国产精品人人爽夜夜爽| 久久九九亚洲综合| 97精品久久久中文字幕免费| 国产美女扒开尿口久久久| 国产精品香蕉在线观看| 法国裸体一区二区| 欧美大奶子在线| 欧美限制级电影在线观看| 欧美裸身视频免费观看| 国产精品视频资源| 97视频在线免费观看| 日韩欧美视频一区二区三区| 91免费福利视频| 亚洲精品久久久久国产| 91麻豆国产语对白在线观看| 91亚洲国产成人久久精品网站| 成人性生交大片免费看小说| 成人激情av在线| 久久999免费视频| 亚洲欧洲一区二区三区在线观看| 欧美激情第1页| 亚洲成人a级网| 国产精品精品一区二区三区午夜版| 2019中文字幕在线免费观看| 国色天香2019中文字幕在线观看| 国产精品视频一区二区三区四| 色噜噜国产精品视频一区二区| 日韩av免费观影| 国产中文字幕亚洲| 亚洲开心激情网| 亚洲精品免费一区二区三区| 国产精品亚洲自拍| 狠狠躁夜夜躁人人爽天天天天97| 91在线精品视频| 精品国产一区二区在线| 日本一欧美一欧美一亚洲视频| 欧美性猛交xxxx富婆| 日韩免费精品视频| 亚洲激情视频在线| 黑人巨大精品欧美一区免费视频| 国产亚洲视频中文字幕视频| 精品视频在线导航| 国产91露脸中文字幕在线| 国产伦精品一区二区三区精品视频| 亚洲乱码国产乱码精品精天堂| 日韩中文有码在线视频| 国产精品国产三级国产专播精品人| 92看片淫黄大片欧美看国产片| 91av福利视频| 国产精品免费电影| 欧美性xxxx极品高清hd直播| 国产一区二区三区丝袜| 国产精品久久久久久中文字| 国产一区二中文字幕在线看| 黄网站色欧美视频| 日韩大片在线观看视频| 国产欧美久久久久久| 最近2019中文免费高清视频观看www99| 日韩大胆人体377p| 国产成人精品a视频一区www| 日韩av在线天堂网| 91成人在线视频| 日韩欧美在线一区| 欧美大片在线免费观看| 91日韩在线播放| 久久精品国产免费观看| 欧美成人一区二区三区电影| 亚洲色图日韩av| 91sao在线观看国产| 久久精品视频在线观看| 日韩av在线看| 中文字幕日本欧美| 久久久久久美女| 欧美精品精品精品精品免费| 国产精品av在线| 成人国内精品久久久久一区| 国产精品久久久久久久久久99| 91av在线看| 777国产偷窥盗摄精品视频| 日韩在线视频免费观看高清中文| 亚洲香蕉av在线一区二区三区| 亚洲国内精品在线| 中文字幕日韩有码| 日日噜噜噜夜夜爽亚洲精品| …久久精品99久久香蕉国产| 亚洲欧美中文日韩v在线观看| 韩国福利视频一区| 日韩免费观看视频| 亚洲无线码在线一区观看| 91精品免费久久久久久久久| 亚洲国产私拍精品国模在线观看| 精品一区二区电影| 欧美日韩激情美女| 成人免费看黄网站| 久久精品国产一区二区电影| www.亚洲免费视频| 亚洲影院色在线观看免费| 91精品国产免费久久久久久| 日韩在线观看精品| 国产在线观看精品一区二区三区| 亚洲r级在线观看| 亚洲级视频在线观看免费1级| 不卡av日日日| 日韩在线视频线视频免费网站| 日韩欧美一区二区三区| 亚洲女性裸体视频| 成人两性免费视频| 日韩综合中文字幕| 国产精品日韩欧美大师| 中文字幕亚洲字幕| 欧美电影在线观看| 精品人伦一区二区三区蜜桃免费| 日韩av电影免费观看高清| 日韩精品一二三四区| 国产精品亚洲аv天堂网| 欧美体内谢she精2性欧美| 国产成人精品在线视频| 亚洲自拍偷拍福利| 午夜精品一区二区三区在线视| 亚洲激情免费观看| 欧美日韩精品国产| 久久久久久久91| 91午夜在线播放| 亚洲精品在线91| 欧美最猛性xxxxx(亚洲精品)| 国产欧美在线观看| 欧美激情精品久久久| 成人黄色影片在线| 久久天天躁狠狠躁夜夜爽蜜月| 国产精品一区二区三区在线播放| 欧美一乱一性一交一视频| 久久成人人人人精品欧|