天天看點

jackson實作簡單對象的序列化,反序列化

在項目開發中,設計到遠端通信時,我們往往需要将目前對象序列化之後進行遠端傳輸。在伺服器端處理完成之後,通常以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的反序列化往往會出現問題。