Есть ли способ создать класс bean из ответа json? - PullRequest
14 голосов
/ 16 сентября 2011

Преобразование JSON в Java

Приведенный выше вопрос относится к тому, что было описано в вышеупомянутой теме.Существует очень много API-интерфейсов, которые обеспечивают гибкость для возврата ответов в формате XML или JSON.** Я хотел бы знать, есть ли способ автоматически создать Java-бин, соответствующий ответу JSON.**

Ответы [ 6 ]

11 голосов
/ 23 сентября 2011

Допустим, вы получаете объект типа

    [
        {
        "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., который создаст этот класс.Вам нужно использовать first и включить сгенерированный код в ваш проект.Другим вариантом может быть динамическая генерация класса с использованием javassist или CGLib, но этот класс будет бесполезен, если вы не используете отражение для доступа к его членам, поэтому даже если будет классом, он будет вести себя как действительно надоедливая Карта.Ни в коем случае не будет лучше, чем просто использовать JSONObject

8 голосов
/ 21 сентября 2011

кажется простым объектом типа сообщения, который не соответствует вашим требованиям?

если вы хотите преобразовать json в существующий и известный класс Java-бинов,

многие 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.

Кстати, если вы общаетесь с отдыхающим веб-сервисом, 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;
}
4 голосов
/ 20 сентября 2011

Я считаю, что главная проблема здесь в том, что в ответе JSON отсутствует информация о типе , и в последний раз, когда я проверял :-) в Java, вам нужно объявить тип свойства класса. Поэтому потребуется некоторая эвристика, чтобы вывести тип из значения в ответе JSON.

По вопросам, связанным здесь, в SO, посмотрите: Создать класс Java из JSON?

2 голосов
/ 16 сентября 2011

Если вы хотите сгенерировать классы Java из JSON, возможно, вы можете попробовать Джексон .Он предоставляет множество функций, связанных с JSON, в том числе возможность генерировать байт-код из произвольного JSON.Подробнее см. в этом блоге .

2 голосов
/ 16 сентября 2011

Да проверить http://flexjson.sourceforge.net

1 голос
/ 26 октября 2012

Если вы используете Джексон (самая популярная библиотека там), попробуйте

https://bitbucket.org/astav/jsontojava/wiki/Home

Его открытый исходный код, и каждый должен иметь возможность внести свой вклад.

Резюме

Генератор файлов исходного класса JsonToJava, который выводит схему на основе предоставленных выборочных данных json и генерирует необходимые структуры данных java.

Это побуждает команды сначала подумать о Json, прежде чем писать настоящий код.

Особенности

Может генерировать классы для произвольно сложной иерархии (рекурсивно) Может читать ваши существующие классы Java и, если он может десериализоваться в эти структуры, сделает это Запрашивает ввод данных пользователем при наличии неоднозначных случаев

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...