您的位置:首页 > 其它

jackson实现简单对象的序列化,反序列化

2017-03-13 22:53 489 查看
在项目开发中,设计到远程通信时,我们往往需要将当前对象序列化之后进行远程传输。在服务器端处理完成之后,通常以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 类型
1objectLinkedHashMap<String,Object>
2arrayArrayList<Object>
3stringString
4complete numberInteger, Long or BigInteger
5fractional numberDouble / BigDecimal
6true | falseBoolean
7nullnull
//完成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的反序列化往往会出现问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: