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更占內存一些。而應用空間換時光,普通是值得的。