以上问题是参考上述线程中描述的内容。有太多的API可以灵活地以XML或JSON形式返回响应。 **我想知道是否有一种方法可以自动构造对应于JSON响应的java bean。 **
答案 0 :(得分: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
}
]
你想要一个像
这样的课程public class Book{
private String author;
private String name;
private Number price
}
有吸气剂和二传手 一种选择是使用像JSONGen这样的服务,它将创建该类。您需要首先使用 ,并在项目中包含生成的代码。 另一个选项可以是使用javassist或CGLib动态生成类,但除非使用反射来访问其成员,否则该类将无用,因此即使 是一个类,它也将表现就像一个非常烦人的地图。使用JSONObject
绝不会更好答案 1 :(得分:8)
似乎是一个简单的消息类型实体不符合您的要求?
如果你想将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.
顺便说一下,如果你正在与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;
}
答案 2 :(得分:4)
我认为这里的主要问题是JSON响应缺少类型信息,上次我在Java中检查:-)你需要声明类属性的类型。因此,需要一些启发式方法来推断JSON响应中值的类型。
对于SO中的相关问题,请查看:Generate Java class from JSON?
答案 3 :(得分:2)
答案 4 :(得分:2)
如果您想从JSON生成Java类,也许可以尝试Jackson。它提供了许多与JSON相关的功能,包括从任意JSON生成字节码的能力。有关详细信息,请参阅this blog post。
答案 5 :(得分:1)
如果您正在使用杰克逊(那里最受欢迎的图书馆),请尝试
https://bitbucket.org/astav/jsontojava/wiki/Home
它的开源,任何人都应该能够贡献。
摘要
JsonToJava源类文件生成器,它根据提供的示例json数据推导出架构,并生成必要的java数据结构。
它鼓励团队在编写实际代码之前先在Json中思考。
功能
可以为任意复杂的层次结构生成类(递归) 可以读取您现有的Java类,如果它可以反序列化为这些结构,则会这样做 当存在模糊情况时会提示用户输入