有没有办法从json响应创建bean类

时间:2011-09-16 04:33:24

标签: java json gson

Converting JSON to Java

以上问题是参考上述线程中描述的内容。有太多的API可以灵活地以XML或JSON形式返回响应。 **我想知道是否有一种方法可以自动构造对应于JSON响应的java bean。 **

6 个答案:

答案 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类,如果它可以反序列化为这些结构,则会这样做 当存在模糊情况时会提示用户输入