采用json-lib-2.4-jdk15.jar把json转化为vo类的时候抛异常,异常信息如下:
net.sf.json.JSONException: java.lang.NoSuchMethodException: Property 'id' has no setter method in class 'class org.research.json.Student'
at net.sf.json.util.PropertySetStrategy$DefaultPropertySetStrategy._setProperty(PropertySetStrategy.java:69)
at net.sf.json.util.PropertySetStrategy$DefaultPropertySetStrategy.setProperty(PropertySetStrategy.java:60)
at net.sf.json.JSONObject.setProperty(JSONObject.java:1394)
at net.sf.json.JSONObject.toBean(JSONObject.java:366)
at net.sf.json.JSONObject.toBean(JSONObject.java:233)
原因是vo类不是public的,错误代码如下:
public class TestJson {
public static void main(String[] args) {
Map<String, Class<String>> classMap = new HashMap<String, Class<String>>();
classMap.put("id", String.class);
classMap.put("name", String.class);
String content = "{ \"id\": \"Elliotte\", \"name\":\"Harold\" }";
Student vo = new Student();
try {
vo = (Student) JSONObject.toBean(JSONObject.fromObject(content), Student.class);
System.out.println("**Student:" + vo);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Student {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}
正确的做法是vo类为非public,产生错误的原因,看java的反射,lib中操作vo属性是调用的是如下代码:
Field field = bean.getClass().getField( key );
if( field != null ){
field.set( bean, value );
}