且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

json-lib 序列化和反序列化

更新时间:2022-05-10 09:40:51

可以使用json-lib来序列化Java对象

依赖的jar包:
json-lib 序列化和反序列化


 如何使用json-lib来序列化java对象呢?

实例:

Java代码  json-lib 序列化和反序列化
  1. @Test  
  2.     public void test_serialize(){  
  3.         Class2 c=new Class2();  
  4.         List<Student>students=new ArrayList<Student>();  
  5.         Student student=new Student();  
  6.         Map<String, Object> attribute =new HashMap<String, Object>();  
  7.         attribute.put("p1""v1");  
  8.         attribute.put("p2""v2");  
  9.         student.setAttribute(attribute);  
  10.         students.add(student);  
  11.         c.setStudents(students);  
  12.         c.setClassName("计算机0705");  
  13.         JSONObject js = JSONObject.fromObject(c/*, jsonConfig*/);  
  14.         System.out.println(js.toString());  
  15.     }  

 运行结果如下:

 

{"classAttribute":null,"className":"计算机0705","count":0,"students":[{"addrr":null,"age":0,"attribute":{"p2":"v2","p1":"v1"},"hobby":"","name":""}]}

 

 

实例:

Java代码  json-lib 序列化和反序列化
  1. @Test  
  2.     public void test_serialize2(){  
  3.         Class2 c=new Class2();  
  4.         List<Student>students=new ArrayList<Student>();  
  5.         Student student=new Student();  
  6.         Map<String, Object> attribute =new HashMap<String, Object>();  
  7.         attribute.put("p1""v1");  
  8.         attribute.put("p2""v2");  
  9.         student.setAttribute(attribute);  
  10.         students.add(student);  
  11.         c.setStudents(students);  
  12.         c.setClassName("计算机0705");  
  13.           
  14.         Map<String, Object> classAttribute =new HashMap<String, Object>();  
  15.         classAttribute.put("pp1""vv1");  
  16.         classAttribute.put("pp2""vv2");  
  17.           
  18.           
  19.         Teacher t=new Teacher();  
  20.         t.setName("熊应标");  
  21.         t.setTitle("语文老师");  
  22.           
  23.         c.setClassAttribute(classAttribute);  
  24. //      One2One one=new One2One();  
  25. //      one.setC(c);  
  26. //      one.setT(t);  
  27.           
  28.         JSONObject js = JSONObject.fromObject(c/*, jsonConfig*/);  
  29.         System.out.println(js.toString());  
  30.     }  

 运行结果如下:

 

{"classAttribute":{"pp1":"vv1","pp2":"vv2"},"className":"计算机0705","count":0,"students":[{"addrr":null,"age":0,"attribute":{"p2":"v2","p1":"v1"},"hobby":"","name":""}]}

 

如何使用json-lib反序列化(把string转化为Java对象)?

参考:http://hw1287789687.iteye.com/admin/blogs/1993048

实例:

Java代码  json-lib 序列化和反序列化
  1. @Test  
  2.     public  void test_reserialize(){  
  3. //      String jsonInput="{\"className\":\"计算机0705\",\"count\":0,\"students\":[{\"addrr\":null,\"age\":0,\"hobby\":\"\",\"name\":\"\"}]}";  
  4.         String jsonInput="{\"classAttribute\":{\"pp1\":\"vv1\",\"pp2\":\"vv2\"},\"className\":\"计算机0705\",\"count\":0,\"students\":[{\"addrr\":null,\"age\":0,\"attribute\":{\"p2\":\"v2\",\"p1\":\"v1\"},\"hobby\":\"\",\"name\":\"\"}]}";  
  5.         JSONObject js = JSONObject.fromObject(jsonInput);  
  6.           
  7.         JsonConfig jsonConfig = new JsonConfig();  
  8.   
  9.         jsonConfig.setRootClass(Class2.class);  
  10.         Map<String, Class> classMap = new HashMap<String, Class>();  
  11.         classMap.put("students", Student.class); // 指定JsonRpcRequest的request字段的内部类型  
  12.         jsonConfig.setClassMap(classMap);  
  13.           
  14.           
  15.           
  16.         Class2 one = (Class2) JSONObject.toBean(js, jsonConfig/*java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to*/);  
  17.         System.out.println(one.getClassName());  
  18.         Map<String, Object> attribute =one.getStudents().get(0).getAttribute();  
  19.         System.out.println(attribute);  
  20.           
  21.     }  

 运行结果:

计算机0705

{p2=v2, p1=v1}

 

序列化时如何删除属性值为null的属性

参考:

http://***.com/questions/8025852/how-to-exclude-properties-from-bean-to-json-at-runtime

 

http://sourceforge.net/p/json-lib/discussion/587134/thread/a82914d9/

下面的事不合要求的:

{"addrr":{"country":"中国","state":"湖北省","street":"清河"},"age":25,"hobby":"","name":"黄威"}

hobby的值为空,应该被过滤掉的。

解决方法:

 

JsonConfig jsonConfig = new JsonConfig();

       jsonConfig.setJsonPropertyFilter(new PropertyFilter() {

           publicboolean apply(Object source, String name, Object value) {

              // System.out.println(name);

              // System.out.println(value);

              if (value == null || (value instanceof String)

                     && ((String) value).equals("")) {

                  returntrue;

              }

              returnfalse;

           }

       });

       JSONObject js = JSONObject.fromObject(student, jsonConfig);

 

 参考:http://hw1287789687.iteye.com/blog/1997956