使用json-lib完成json的序列化和反序列化.doc_第1页
使用json-lib完成json的序列化和反序列化.doc_第2页
使用json-lib完成json的序列化和反序列化.doc_第3页
使用json-lib完成json的序列化和反序列化.doc_第4页
使用json-lib完成json的序列化和反序列化.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用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 HashSet(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-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.println(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:开发部,empname:张三,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.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 dao=(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 the 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 objectToJson()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,config).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(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);上述两种解决方案可以解决部分问题,但是json-lib使用代理进行反射,所以如果想要部门表的信息,而去过滤部门表的员工对象,这样还是解决不了。这样可以使用更简单有效的方案(3)使用jsonConfig的setCycleDetectionStrategy()方法进行忽略死循环使用jsonConfig的registerJsonValueProcessor()进行属性转换设置 /* 通过对象转换成json* author 凤生禾予*/public void objectToJson()ClassPathXmlApplicationContext xa=new ClassPathXmlApplicationContext(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.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 processArrayValue(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();JsonConfig config=new JsonConfig();config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);config.registerJsonValueProcessor(Date.class, new JsonValueProcessor() Overridepublic Object processObjectValue(String arg0, Object arg1, JsonConfig arg2) / TODO Auto-generated method stubSimpleDateFormat sdf=new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);Date d=(Date) arg1;return sdf.format(d);Overridepublic Object processArrayValue(Object arg0, JsonConfig arg1) / TODO Auto-generated method stubreturn null;);String s=JSONArray.fromObject(emps,config).toString();System.out.println(s); 这个和上面没有太多区别。总结:使用json-lib进行对象的序列化和反序列化的文档比较少,在工作中进行及时总结经验是一个比较好的方式。 json-lib对象的序列化比较简单,重要的是使用JSONObject和JSONArray两个对象,这两个对象进行序列化pojo对象之前,必须将

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论