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

Jas*_*son 14 java json gson

将JSON转换为Java

上述问题是参考上述线程中描述的内容.有这么多的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绝不会更好


swa*_*liu 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.
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)