可以使用json-lib来序列化java对象
依赖的jar包:
如何使用json-lib来序列化java对象呢?
实例:
@Test public void test_serialize(){ Class2 c=new Class2(); List<Student>students=new ArrayList<Student>(); Student student=new Student(); Map<String, Object> attribute =new HashMap<String, Object>(); attribute.put("p1", "v1"); attribute.put("p2", "v2"); student.setAttribute(attribute); students.add(student); c.setStudents(students); c.setClassName("计算机0705"); JSONObject js = JSONObject.fromObject(c/*, jsonConfig*/); System.out.println(js.toString()); }
运行结果如下:
{"classAttribute":null,"className":"计算机0705","count":0,"students":[{"addrr":null,"age":0,"attribute":{"p2":"v2","p1":"v1"},"hobby":"","name":""}]}
实例:
@Test public void test_serialize2(){ Class2 c=new Class2(); List<Student>students=new ArrayList<Student>(); Student student=new Student(); Map<String, Object> attribute =new HashMap<String, Object>(); attribute.put("p1", "v1"); attribute.put("p2", "v2"); student.setAttribute(attribute); students.add(student); c.setStudents(students); c.setClassName("计算机0705"); Map<String, Object> classAttribute =new HashMap<String, Object>(); classAttribute.put("pp1", "vv1"); classAttribute.put("pp2", "vv2"); Teacher t=new Teacher(); t.setName("熊应标"); t.setTitle("语文老师"); c.setClassAttribute(classAttribute); // One2One one=new One2One(); // one.setC(c); // one.setT(t); JSONObject js = JSONObject.fromObject(c/*, jsonConfig*/); System.out.println(js.toString()); }
运行结果如下:
{"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
实例:
@Test public void test_reserialize(){ // String jsonInput="{\"className\":\"计算机0705\",\"count\":0,\"students\":[{\"addrr\":null,\"age\":0,\"hobby\":\"\",\"name\":\"\"}]}"; String jsonInput="{\"classAttribute\":{\"pp1\":\"vv1\",\"pp2\":\"vv2\"},\"className\":\"计算机0705\",\"count\":0,\"students\":[{\"addrr\":null,\"age\":0,\"attribute\":{\"p2\":\"v2\",\"p1\":\"v1\"},\"hobby\":\"\",\"name\":\"\"}]}"; JSONObject js = JSONObject.fromObject(jsonInput); JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setRootClass(Class2.class); Map<String, Class> classMap = new HashMap<String, Class>(); classMap.put("students", Student.class); // 指定JsonRpcRequest的request字段的内部类型 jsonConfig.setClassMap(classMap); Class2 one = (Class2) JSONObject.toBean(js, jsonConfig/*java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to*/); System.out.println(one.getClassName()); Map<String, Object> attribute =one.getStudents().get(0).getAttribute(); System.out.println(attribute); }
运行结果:
计算机0705
{p2=v2, p1=v1}
序列化时如何删除属性值为null的属性
参考:
http://stackoverflow.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
源代码见附件