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复杂对象
2).主程序功能
我们从程序执行结果可以看出,json中默认存储对象是以linkedHashMap格式的。在我们反序列化时,并没有还原出对象。但是我们可以通过对象的方法获得关于对象的一些属性。关于json数据类型与java中数据类型的对比如下,这更有利于你的理解。
//完成map与json对象间转化,map比一般对象更加类型,可以任意添加键值对
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的反序列化往往会出现问题。
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 |
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的反序列化往往会出现问题。
相关文章推荐
- 在.Net中通过序列化和反序列化实现对象实例化
- C#实现对象的Xml格式序列化及反序列化
- c#实现对象的xml格式序列化及反序列化
- .NET Framewok 3.5 中 JSON 序列化和反序列化的简单实现
- 对象,对象集合的简单Xml序列化与反序列化
- C#实现对象的Xml格式序列化及反序列化
- .NET Framewok 3.5 中 JSON 序列化和反序列化的简单实现
- .NET Framewok 3.5 中 JSON 序列化和反序列化的简单实现
- C#实现对象的Xml格式序列化及反序列化
- 简单的WindowsForm Client与WebService通信例子[对象的序列化与反序列化]
- C# 实现复杂对象的序列化与反序列化[收藏此页] [打印]【IT168知识库】
- 通过序列化和反序列化泛型数据实体集合来实现持久化数据对象的方法
- 一个简单的把对象序列化/反序列化为json格式的程序
- C#实现对象的Xml格式序列化及反序列化
- 对象,对象集合的简单Xml序列化与反序列化 【实用代码,含泛型方法】
- C#实现对象的Xml格式序列化及反序列化
- C#实现对象的Xml格式序列化及反序列化
- 通过序列化和反序列化泛型数据实体集合来实现持久化数据对象的方法
- 用序列化/反序列化实现对象的(深)拷贝
- 实现对象的序列化和反序列化