上述问题是参考上述线程中描述的内容.有这么多的API可以灵活地以XML或JSON的形式返回响应.**我想知道是否有一种方法可以自动构造对应于JSON响应的java bean.**
Pab*_*afi 11
让我们说你得到一个像这样的对象
[
{
"name":"Java 6 Greatest Hits",
"Author":"Jim Bob Jones",
"price":10.25
},
{
"name":"How to raise a goat",
"Author":"Sir Paxton",
"price":55.97
},
{
"name":"Snow - It is cold",
"Author":"Dr. White",
"price":9.99
}
]
Run Code Online (Sandbox Code Playgroud)
你想要一个类似的课程
public class Book{
private String author;
private String name;
private Number price
}
Run Code Online (Sandbox Code Playgroud)
getter和setter一个选项是使用像JSONGen这样的服务,它将创建该类.您需要使用它第一,并在项目中包含生成的代码.另一种选择可能是动态生成使用了Javassist或CGLIB的类,但除非你使用反射来访问其成员,所以即使该类将是无用的将是一个类,它会表现得就像一个非常恼人的地图.使用JSONObject绝不会更好
似乎一个简单的消息类型实体不符合您的要求?
如果你想将json转换为现有的已知java bean类,
许多lib都可以这样做,比如
http://json-lib.sourceforge.net/apidocs/net/sf/json/class-use/JSONObject.html
JSONObject.toBean(JSONObject jsonObject, Class beanClass)
Creates a bean from a JSONObject, with a specific target class.
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果你正在与restful webservice进行通信,org.springframework.web.client.RestTemplate将帮助你获得直接bean结果而不是json.
如果类不存在,则需要使用java反射机制的程序. 尝试使用CGLIB,http: //cglib.sourceforge.net/,动态创建类似BeanMap的类.我写了一个简单的示例,但是要洁具,操作类字节很难,你可能会遇到JVM的奇怪问题.强烈不鼓励这样做.
public static BeanMap generateBean(JSONObject json) {
BeanGenerator generator = new BeanGenerator();
Iterator keys = json.keys();
while (keys.hasNext()) {
Object key = keys.next();
Object value = json.get(key);
Class keyClass = guessValueClass(value);
generator.addProperty(key.toString(), keyClass);
}
Object result = generator.create();
BeanMap bean = BeanMap.create(result);
keys = json.keys();
while (keys.hasNext()) {
Object key = keys.next();
Object value = json.get(key);
bean.put(key, value);
}
return bean;
}
/**
* TODO fix guess
*/
static Class guessValueClass(Object value) {
try {
Integer.parseInt(value.toString());
return Integer.class;
} catch (NumberFormatException e1) {
}
try {
Double.parseDouble(value.toString());
return Double.class;
} catch (NumberFormatException e1) {
}
return String.class;
}
Run Code Online (Sandbox Code Playgroud)