程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Jackson的用法實例剖析

Jackson的用法實例剖析

編輯:關於JAVA

Jackson的用法實例剖析。本站提示廣大學習愛好者:(Jackson的用法實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是Jackson的用法實例剖析正文


淺顯的來講,Jackson是一個 Java 用來處置 JSON 格局數據的類庫,其機能異常好。本文就來針對Jackson的用法做一個較為具體的實例剖析。詳細以下:

1、簡介

Jackson具有比擬高的序列化和反序列化效力,據測試,不管是哪一種情勢的轉換,Jackson > Gson > Json-lib,並且Jackson的處置才能乃至凌駕Json-lib近10倍閣下,且准確性也非常高。比擬之下,Json-lib仿佛曾經停滯更新,最新的版本也是基於JDK15,而Jackson的社區則較為活潑。
上面,聯合實例來對Jackson的用法停止簡略引見。

2、應用

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());
}
}

在掌握台下輸入的成果是:

357
504604.59802246094 305569.9150390625
358
504602.2680053711 305554.43603515625

結論:

此辦法相似於XML解析中的DOM方法解析,其利益是構造明細,便於提取想要的信息。固然,其缺陷也和此辦法一樣:耗時費空間。

三.總結

Jackson關於Json的操作重要如上所示,其辦法應用起來很方便,並且也很靈巧,即供給了一次性完成的操作,也供給了可以按需讀守信息的操作。而且Jackson的功效很齊備,可以對序列化和反序列化停止多種細節的掌握,例如注解功效和關於Hibernate的延遲注入功效和設置時光格局功效等,由於這些功效今朝不太須要,所以細心研討留待今後。同時,Jackson還支撐對XML的一系列序列化和反序列化的操作,其思緒與解析Json的年夜致雷同。
關於Jackson今朝的缺陷,網上有人測試所比Json-lib更占內存一些。而應用空間換時光,普通是值得的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved