使用json-lib完成json的序列化和反序列化

上传人:第*** 文档编号:32821107 上传时间:2018-02-12 格式:DOC 页数:5 大小:57.50KB
返回 下载 相关 举报
使用json-lib完成json的序列化和反序列化_第1页
第1页 / 共5页
使用json-lib完成json的序列化和反序列化_第2页
第2页 / 共5页
使用json-lib完成json的序列化和反序列化_第3页
第3页 / 共5页
使用json-lib完成json的序列化和反序列化_第4页
第4页 / 共5页
使用json-lib完成json的序列化和反序列化_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《使用json-lib完成json的序列化和反序列化》由会员分享,可在线阅读,更多相关《使用json-lib完成json的序列化和反序列化(5页珍藏版)》请在金锄头文库上搜索。

1、使用json-lib 完成json的序列化和反序列化2011-07-29 14:07:43分类: 默认分类 | 标签:软件 java json.json的序列化和反序列化在现在的javaweb中特别是ajax中使用的比较频繁,现在本人就这种技术提出自己的使用心得。我的pojo 对象的结构是这样的部门表和员工表 1对多的关系部门对象public class Dept implements java.io.Serializable private Integer depid;/部门IDprivate String depname;/部门名称private Set emps = new HashSe

2、t(0);/员工集合员工对象public class Emp implements java.io.Serializable private Integer empid;/员工idprivate Dept dept;/部门private String empname;/员工名称private Date birthday;/生日1.json字符串序列化成对象/* 通过json 转换成对象* author 凤生禾予*/public void jsonToObject()Date d=new Date();SimpleDateFormat sdf=new SimpleDateFormat(yyyy-

3、MM-dd);StringBuffer str=new StringBuffer();/ json字符串str.append(empid:1,dept:depid:1,depname:开发部,empname:张三,birthday:+sdf.format(d)+);/ 使用JSONObject 将json 序列化对象JSONObject obj=JSONObject.fromObject(str.toString();/ 将JOSNObject 对象转换成pojo 对象Emp emp=(Emp) JSONObject.toBean(obj,Emp.class);System.out.print

4、ln(emp.getBirthday();这里需要注意的是json字符串的写法以表示一个对象,字符串必须加引号 2json字符串序列化成集合/* 通过json 转换成集合* author 凤生禾予*/public void jsonToArray()Date d=new Date();SimpleDateFormat sdf=new SimpleDateFormat(yyyy-MM-dd);StringBuffer str=new StringBuffer();/json字符串str.append();str.append(empid:1,dept:depid:1,depname:开发部,em

5、pname:张三,birthday:+sdf.format(d)+);str.append(,);str.append(empid:2,dept:depid:1,depname:开发部,empname:李四,birthday:+sdf.format(d)+);str.append();/将json转换成JSONArray对象JSONArray arr=JSONArray.fromObject(str.toString();/使用JSONArray转换成集合List list=JSONArray.toList(arr,Emp.class);for (Emp emp : list) System.

6、out.println(emp.getEmpname();System.out.println(emp.getBirthday();System.out.println(emp.getDept().getDepname();这里需要注意的是json的数组用法为3.对象反序列化成json/* 通过对象转换成json* author 凤生禾予*/public void objectToJson()ClassPathXmlApplicationContext xa=new ClassPathXmlApplicationContext(applicationContext.xml);EmpDAO da

7、o=(EmpDAO) xa.getBean(EmpDAO);/查找对象Emp emp=dao.findById(27);String s=JSONObject.fromObject(emp).toString();System.out.println(s);这里会有2个问题1.pojo中对象存在有死循环问题,部门类中有员工对象的集合,员工类中有部门的对象,json-lib反序列化中会进行双向转换,从而形成死循环,会报一个json-lib的经典异常:Exception in thread main net.sf.json.JSONException: There is a cycle in th

8、e hierarchy!2.日期类型转换json-lib转换出来的日期类型格式birthday:date:1,day:0,hours:0,minutes:0,month:7,nanos:0,seconds:0,time:1280592000000,timezoneOffset:-480,year:110那么我们如果想要yyyy-MM-dd HH:mm:ss 这种格式的怎么办呢?那么解决方案有3个都必须使用jsonConfig 对象进行处理(1)使用jsonConfig的setExcludes的方法进行过滤,将所需要过滤的字段名传入setExcludes方法public void objectT

9、oJson()ClassPathXmlApplicationContext xa=new ClassPathXmlApplicationContext(applicationContext.xml);EmpDAO dao=(EmpDAO) xa.getBean(EmpDAO);/查找对象Emp emp=dao.findById(27);/创建jsonConfig对象JsonConfig config=new JsonConfig();/设置过滤字段config.setExcludes(new Stringdept);String s=JSONObject.fromObject(emp,conf

10、ig).toString();System.out.println(s);(2)使用jsonConfig的setJsonPropertyFilter 进行属性过滤,过滤器中返回 true表示过滤该字段,返回false表示可以转换该字段public void objectToJson()ClassPathXmlApplicationContext xa=new ClassPathXmlApplicationContext(applicationContext.xml);EmpDAO dao=(EmpDAO) xa.getBean(EmpDAO);/查找对象Emp emp=dao.findById

11、(27);/创建jsonConfig对象JsonConfig config=new JsonConfig();/设置过滤字段config.setJsonPropertyFilter(new PropertyFilter() public boolean apply(Object arg0, String arg1, Object arg2) if(dept.equals(arg1)return true;return false;);String s=JSONObject.fromObject(emp,config).toString();System.out.println(s);上述两种解

12、决方案可以解决部分问题,但是json-lib使用代理进行反射,所以如果想要部门表的信息,而去过滤部门表的员工对象,这样还是解决不了。这样可以使用更简单有效的方案(3)使用jsonConfig的setCycleDetectionStrategy()方法进行忽略死循环使用jsonConfig 的registerJsonValueProcessor()进行属性转换设置/* 通过对象转换成json* author 凤生禾予*/public void objectToJson()ClassPathXmlApplicationContext xa=new ClassPathXmlApplicationCo

13、ntext(applicationContext.xml);EmpDAO dao=(EmpDAO) xa.getBean(EmpDAO);/查找对象Emp emp=dao.findById(27);/创建jsonConfig对象JsonConfig config=new JsonConfig();/设置循环策略为忽略 解决json最头疼的问题 死循环config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);/设置 json转换的处理器 用来处理日期类型/凡是反序列化Date类型的对象,都会经过该处理器进行处理config.

14、registerJsonValueProcessor(Date.class, new JsonValueProcessor() /参数1 :属性名 参数2 :json对象的值 参数3:jsonConfig对象public Object processObjectValue(String arg0, Object arg1, JsonConfig arg2) SimpleDateFormat sdf=new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);Date d=(Date) arg1;return sdf.format(d);public Object pro

15、cessArrayValue(Object arg0, JsonConfig arg1) return null;);String s=JSONObject.fromObject(emp,config).toString();System.out.println(s);这种方案可以解决死循环问题和日期格式化的问题。结果:birthday:2010-08-01 00:00:00,dept:depid:1,depname:开发部,emps:birthday:2009-08-01 00:00:00,dept:null,empid:30,empname:田七, null,empid:27,empname:王五 3.集合反序列化成json/* 通过集合转换成json* author 凤生禾予*/public void arrayToJson()ClassPathXmlApplicationContext xa=new ClassPathXmlApplicationContext(applicationContext.xml);EmpDAO dao=(EmpDAO) xa.getBean(EmpDAO);List emps=dao.findAll();J

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号