在项目开发中,设计到远程通信时,我们往往需要将当前对象序列化之后进行远程传输。在服务器端处理完成之后,通常以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的反序列化往往会出现问题。