天天看点

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的反序列化往往会出现问题。