在項目開發中,設計到遠端通信時,我們往往需要将目前對象序列化之後進行遠端傳輸。在伺服器端處理完成之後,通常以json格式(輕量級)傳回.
jackson可以将java對象和json進行轉換并進行傳輸,并可以在遠端完成json字元串還原為相應對象的操作。同時jaskson還可實作xml和json格式
一. jackson簡介
1.定義:
JSON的全稱是JavaScript Object Notation,是一種輕量級的資料交換格式。 JSON與 XML具有相同的特性,例如易于人編寫和閱讀,易于機器生成和解析。但是 JSON比XML資料傳輸的有效性要高出很多。 JSON完全獨立與程式設計語言,使用文本格式儲存。JSON的資料格式是名/值對,其中值可以是:
數字(整數或浮點數)
字元串(在雙引号中)
邏輯值(true 或 false)
數組(在方括号中)
對象(在花括号中)對象中屬性預設以map<type,object>處理
null
2.學習文檔與資料
jackson開發文檔
二.jackson操作
1.開發包下載下傳
jackson jar
2.程式
1)java複雜對象
public class User {
public String username="";
public int id=0;
//嵌套link對象
public ArrayList<Link>link=null;
public Map<String,Object> result=null;
//setter and getter方法這裡省略
}
public class Link {
public String name="";
public String phone="";
//setter andgetter方法這裡省略
}
2).主程式功能
public class myObjectMapper {
ObjectMapper mapper = new ObjectMapper();
//Test
public void setUser(User user){
user.setId(1);
user.setUsername("xiaoxiang");
Link lk=new Link();
lk.setName("rongrong");
lk.setPhone("1234234");
Link lk1=new Link();
lk1.setName("rongrong");
lk1.setPhone("1234234");
ArrayList<Link> list=new ArrayList();
list.add(lk1);
list.add(lk);
user.setLink(list);
Map map=new HashMap();
map.put("123",lk);
map.put("234",lk1);
user.setResult(map);
}
//完成java對象與json直接的轉化
public void testObject(){
User user=new User();
setUser(user);
//将對象轉化為字元串
String str="";
try {
str=mapper.writeValueAsString(user);
System.out.println(str);
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将字元串變成對象
try {
User myuser=mapper.readValue(str,User.class);
Map map=myuser.getResult();
System.out.println("result :"+map.get("123"));
System.out.println("result type:"+map.get("123").getClass());
} catch (JsonParseException e) {
}
}
執行結果如下:
.................object to json...........
{"username":"xiaoxiang","id":1,"link":[{"name":"rongrong","phone":"1234234"},{"name":"rongrong","phone":"1234234"}],
"result":{"123":{"name":"rongrong","phone":"1234234"},"234":{"name":"rongrong","phone":"1234234"}}}
.................json to object...........
result :{name=rongrong, phone=1234234}
result type:class java.util.LinkedHashMap
我們從程式執行結果可以看出,json中預設存儲對象是以linkedHashMap格式的。在我們反序列化時,并沒有還原出對象。但是我們可以通過對象的方法獲得關于對象的一些屬性。關于json資料類型與java中資料類型的對比如下,這更有利于你的了解。
Sr. No. | JSON 類型 | Java 類型 |
---|---|---|
1 | object | LinkedHashMap<String,Object> |
2 | array | ArrayList<Object> |
3 | string | String |
4 | complete number | Integer, Long or BigInteger |
5 | fractional number | Double / BigDecimal |
6 | true | false | Boolean |
7 | null | null |
//完成map與json對象間轉化,map比一般對象更加類型,可以任意添加鍵值對
public void testMap(){
User user=new User();
setUser(user);
Map map=new HashMap();
map.put("123",user);
map.put("234",user);
String str="";
System.out.println("*********map to json****************");
try {
str=mapper.writeValueAsString(map);
System.out.println(str);
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("*********将json to map****************");
try {
Map map1=mapper.readValue(str,new TypeReference<Map<String,User>>(){});
java.util.Iterator it=map1.keySet().iterator();
while(it.hasNext()){
System.out.println(map1.get(it.next()).getClass());
User userm=(User) map1.get(it.next());
System.out.println("userm"+userm.getResult().get("123"));
}
} catch (JsonParseException e) {
}
}
執行結果如下:
*********map to json****************
{"123":{"username":"xiaoxiang","id":1,"link":[{"name":"rongrong","phone":"1234234"},{"name":"rongrong","phone":"1234234"}],
"result":{"123":{"name":"rongrong","phone":"1234234"},"234":{"name":"rongrong","phone":"1234234"}}},"234":{"username":"xiaoxiang",
"id":1,"link":[{"name":"rongrong","phone":"1234234"},{"name":"rongrong","phone":"1234234"}],"result":{"123":{"name":"rongrong","phone":"1234234"},
"234":{"name":"rongrong","phone":"1234234"}}}}
*********将json to map****************
value type: test.User
userm{name=rongrong, phone=1234234}
如果我們将
Map map1=mapper.readValue(str,new TypeReference<Map<String,User>>(){});
改寫成 Map map1=mapper.readValue(str,Map.class);
那麼程式将報java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to test.User
即類型轉化異常,前面我們說過json是預設以linkedHashMap來存放object對象的,所有當我們反序列化時,必須進行資料類型綁定,指明我們的map中的value類型。
類似的如集合中的其他元素在序列化和反序列化時,通過都需要進行類似的操作,否則無法進行資料元素擷取。
三.總結
1.jackson基本用法步驟
1)定義轉化器
ObjectMapper mapper = new ObjectMapper();
2)java 對象轉json
mapper.wrieValueAsString(object o)
3)json反序列化成對象
mapper.readValue(String jsonstr,Class<T>)
如果T為集合類map,list 等,則使用new TypeReference<Class<T>(){}
我們以上述案例為例,則new TypeReference<Map<String,User>>(){}
2.常見錯誤
TypeReference -- 讓Jackson Json在List/Map中識别自己的Object
3.jackson優缺點
優點:jackson适合對任意對象做序列化成json傳輸。
缺點:jackson适合對簡單對象進行序列化和反序列化,一旦涉及到複雜對象,jackson的反序列化往往會出現問題。