json-lib 序列化和反序列化

可以使用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

源代码见附件

 

你可能感兴趣的:(反序列化,json-lib,Serialize,toBean,序列化java对象)