在java对象和json之间做转换的时候,json-lib组件,使用的是对象的getter/setter方法,即调用这些方法,不管这些getter/setter方法有没有对应的属性。因此,在做java对象与json之间的转换时候,除了属性的getter/setter方法,其他方法最好不要以get/set开头。
package cycle; public class ComplexData { private String first; public ComplexData() { } public String getOne() { first = "123"; return first; } public void setOne(String str) { this.first = str; } public void setTestYes(String str) { System.out.println("json to java时候,会被调用"); } public void setTestNot() { System.out.println("不符合set方法约束,没有参数,不会被调用"); } public void getNotCall() { System.out.println("不会被调用,该方法虽然以get开头,但是没有返回值,不符合javabean约定"); } public String getCanCall() { System.out.println("虽然不是获取属性方法,但是符合javabean约定,会被调用"); return null; } }
//测试代码 ComplexData comp = new ComplexData(); System.out.println(JSONObject.fromObject(comp)); String str = "{one:0,testYes:1,testNot:2}"; ComplexData after = (ComplexData) JSONObject.toBean(JSONObject.fromObject(str), ComplexData.class); System.out.println(after.getOne());
程序执行结果:
虽然不是获取属性方法,但是符合javabean约定,会被调用
2013-7-4 21:36:46 net.sf.json.JSONObject defaultBeanProcessing
信息: Property 'testYes' of class cycle.ComplexData has no read method. SKIPPED
{"canCall":"","one":"123"}
json to java时候,会被调用
123
2013-7-4 21:36:46 net.sf.json.JSONObject toBean
警告: Tried to assign property testNot:java.lang.Integer to bean of class cycle.ComplexData