Создать класс Java из JSON?

216

В проекте Java Maven, как вы генерируете исходные файлы Java из JSON? Например, у нас есть

{
  "firstName": "John",  
  "lastName": "Smith",  
  "address": {  
    "streetAddress": "21 2nd Street",  
     "city": "New York"
  }
}

Когда мы запускаем, mvn generate-sourcesмы хотим, чтобы он генерировал что-то вроде этого:

class Address  {
    JSONObject mInternalJSONObject;

    Address (JSONObject json){
        mInternalJSONObject = json;
    }

    String  getStreetAddress () {
        return mInternalJSONObject.getString("streetAddress");
    }

    String  getCity (){
        return mInternalJSONObject.getString("city");
    }
}

class Person {        
    JSONObject mInternalJSONObject;

    Person (JSONObject json){
        mInternalJSONObject = json;
    }

    String  getFirstName () {
        return mInternalJSONObject.getString("firstName");
    }

    String  getLastName (){
        return mInternalJSONObject.getString("lastName");
    }

    Address getAddress (){
        return Address(mInternalJSONObject.getString("address"));
    }
}

Как разработчик Java, какие строки XML мне нужно написать в моем pom.xml, чтобы это произошло?

Денис Пальницкий
источник
Я обновил вопрос и ответ, чтобы сделать их по теме. Пожалуйста, откройте заново.
Алекс Р

Ответы:

270

Попробуйте подключаемый модуль jsonschema2pojo :

        <plugin>
            <groupId>org.jsonschema2pojo</groupId>
            <artifactId>jsonschema2pojo-maven-plugin</artifactId>
            <version>1.0.2</version>
            <configuration>
                <sourceDirectory>${basedir}/src/main/resources/schemas</sourceDirectory>
                <targetPackage>com.myproject.jsonschemas</targetPackage>
                <sourceType>json</sourceType>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

В <sourceType>json</sourceType>охватывает случай , когда источники JSON (например , ОР). Если у вас есть реальные схемы JSON , удалите эту строку.

Обновлено в 2020 году. С декабря 2009 года, когда был задан этот вопрос, произошли две вещи:

  • Спецификация JSON Schema сильно изменилась. Он все еще в черновике (не завершен), но близок к завершению и теперь является жизнеспособным инструментом, определяющим ваши структурные правила

  • Недавно я начал новый проект с открытым исходным кодом, специально предназначенный для решения вашей проблемы: jsonschema2pojo . Инструмент jsonschema2pojo берет документ схемы json и генерирует классы Java в стиле DTO (в форме исходных файлов .java). Проект еще не завершен, но уже охватывает наиболее полезные части схемы JSON. Я ищу больше отзывов от пользователей, чтобы помочь развитию. Прямо сейчас вы можете использовать инструмент из командной строки или в качестве плагина Maven.

Надеюсь это поможет!

joelittlejohn
источник
4
Не должен ли кто-то, кто использовал ваш инструмент jsonschema2pojo, написать свой собственный файл схемы? ОП попросил начать с файла Json, а не со схемы. Есть ли сопутствующий инструмент для перехода от Json -> Schema? Я предполагаю, что такой инструмент, если бы он существовал, мог дать только предположение.
Джефф Аксельрод
3
Начиная с версии 0.3.3, вы можете использовать старый
добрый
14
... и теперь есть онлайн-генератор: jsonschema2pojo.org
joelittlejohn
2
Отличный инструмент. Прилагаемая ссылка содержит онлайн-инструмент, куда вы можете вставить образец JSON, нажать кнопку и получить исходный код Java.
mbmast
1
@testerjoe Если вы имеете в виду исходный код Java, то да, jsonschema2pojo делает это, и он доступен как плагин maven, задача ant, расширение gradle, инструмент CLI, библиотека java и т. д.
joelittlejohn
21

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

https://github.com/astav/JsonToJava

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

Резюме

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

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

Характеристики

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

Вот онлайн-инструмент, который будет принимать JSON, включая вложенные объекты или вложенные массивы объектов, и генерировать исходный код Java с аннотациями Джексона.

Тим Будро
источник
1
Это сработало очень хорошо для меня с первого взгляда. Я глубоко вложил JSON, и он работал нормально, хотя мне пришлось обрезать лишние части, чтобы получить общий размер ниже 2 КБ. Позволил мне написать: MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (someURLthatReturnsJSON), MyClass.class); и результирующие данные текли отлично. Мне пришлось удалить все эти записи Джексона, но в остальном это работало нормально для gson. Спасибо.
noogrub
Спасибо, это работает. Когда я отправил JSON с чувствительными к регистру полями, этот сайт дал результат, а www.jsonschema2pojo.org сообщил об ошибке.
CoolMind,
6

Отвечая на этот старый вопрос с недавним проектом ;-).

На данный момент лучшим решением, вероятно, является JsonSchema2Pojo :

Это делает работу с редко используемой Json Schema, но также и с простым Json. Он предоставляет плагин Ant и Maven, а тестовое приложение онлайн может дать вам представление об инструменте. Я положил Json Tweet и сгенерировал весь содержащий класс (Tweet, User, Location и т. Д.).

Мы будем использовать его в проекте Agorava для создания карт социальных сетей и продолжения эволюции их API.

Антуан Сабо-Дюран
источник
Это тоже мое впечатление, но я еще не пробовал плагин Maven, однако онлайн-версия довольно медленная и умирает для всего, кроме обычного класса Person ... Так что для быстрого онлайн-конвертирования инструмент @ tim-boudreau работал лучше всего для меня.
Грегор
Я попробовал JsonSchema2Pojo, но при нажатии кнопки «Просмотр» появляется пустой предварительный просмотр.
AndroidDev
5

Спасибо всем, кто пытался помочь.
Для меня этот сценарий был полезен. Он обрабатывает только плоский JSON и не заботится о типах, но автоматизирует некоторые процедуры

  String str = 
        "{"
            + "'title': 'Computing and Information systems',"
            + "'id' : 1,"
            + "'children' : 'true',"
            + "'groups' : [{"
                + "'title' : 'Level one CIS',"
                + "'id' : 2,"
                + "'children' : 'true',"
                + "'groups' : [{"
                    + "'title' : 'Intro To Computing and Internet',"
                    + "'id' : 3,"
                    + "'children': 'false',"
                    + "'groups':[]"
                + "}]" 
            + "}]"
        + "}";



    JSONObject json = new JSONObject(str);
    Iterator<String> iterator =  json.keys();

    System.out.println("Fields:");
    while (iterator.hasNext() ){
       System.out.println(String.format("public String %s;", iterator.next()));
    }

    System.out.println("public void Parse (String str){");
    System.out.println("JSONObject json = new JSONObject(str);");

    iterator  = json.keys();
    while (iterator.hasNext() ){
       String key = iterator.next();
       System.out.println(String.format("this.%s = json.getString(\"%s\");",key,key ));

    System.out.println("}");
Денис Пальницкий
источник
5

Я знаю, что это старый вопрос, но я наткнулся на него, пытаясь найти ответ сам.

Ответ, в котором упоминается онлайн-генератор json-pojo (jsongen), хорош, но мне нужно было кое-что, что я мог бы запустить в командной строке и настроить больше.

Поэтому я написал очень хакерский скрипт ruby, чтобы взять пример файла JSON и сгенерировать из него POJO. Он имеет ряд ограничений (например, он не работает с полями, которые соответствуют зарезервированным ключевым словам Java), но этого достаточно для многих случаев.

Сгенерированный код по умолчанию помечает для использования с Джексоном, но это можно отключить с помощью переключателя.

Вы можете найти код на github: https://github.com/wotifgroup/json2pojo

Крис Р
источник
2

Насколько я знаю, такого инструмента нет. Все же.

Я подозреваю, что главная причина в том, что в отличие от XML (который имеет XML-схему, а затем такие инструменты, как 'xjc', чтобы делать то, что вы просите, между определениями XML и POJO), нет полностью функционального языка схемы. Существует схема JSON, но она очень мало поддерживает фактические определения типов (фокусируется на структурах JSON), поэтому было бы сложно создать классы Java. Но, вероятно, все еще возможно, особенно если некоторые соглашения об именах были определены и использованы для поддержки генерации.

Однако: это то, что довольно часто запрашивается (в списках рассылки проектов инструментов JSON, за которыми я следую), поэтому я думаю, что кто-то напишет такой инструмент в ближайшем будущем.

Так что я не думаю, что это плохая идея сама по себе (также: это не хорошая идея для всех вариантов использования, зависит от того, что вы хотите сделать).

StaxMan
источник
2

У меня была такая же проблема, поэтому я решил начать писать небольшой инструмент, чтобы помочь мне с этим. Я собираюсь поделиться и открыть источник.

https://github.com/BrunoAlexandreMendesMartins/CleverModels

Он поддерживает JAVA, C # и Objective-C от JSON.

Не стесняйтесь вносить свой вклад!

ehanoc
источник
2

Вы также можете попробовать библиотеку GSON. Он достаточно мощный, он может создавать JSON из коллекций, пользовательских объектов и работает также наоборот. Он выпущен под лицензией Apache License 2.0, поэтому вы можете использовать его и в коммерческих целях.

http://code.google.com/p/google-gson/

MB.One
источник
13
не создает определения Java
некромант
3
Вопрос не в этом
хоп
1

Я создал проект Github Json2Java, который делает это. https://github.com/inder123/json2java

Json2Java предоставляет настройки, такие как переименование полей и создание иерархий наследования.

Я использовал инструмент для создания некоторых относительно сложных API:

API TMS Gracenote: https://github.com/inder123/gracenote-java-api

API геокодирования Карт Google: https://github.com/inder123/geocoding

Индера
источник
0

Добавить в пост @ japher. Если вы не особенно привязаны к JSON, стоит проверить протоколные буферы .

dgorissen
источник
1
Протокол Buffers даже не близок к ответу о том, как создавать объекты Java из JSON. По крайней мере, вы должны были порекомендовать инструмент для создания объектов Java из буферов протокола.
james.garriss
0

Попробуйте мое решение

http://htmlpreview.github.io/?https://raw.githubusercontent.com/foobnix/android-universal-utils/master/json/generator.html

{
    "auctionHouse": "sample string 1",
    "bidDate": "2014-05-30T08:20:38.5426521-04:00 ",
    "bidPrice": 3,
    "bidPrice1": 3.1,
    "isYear":true
}

Результат Java Class

private String  auctionHouse;
private Date  bidDate;
private int  bidPrice;
private double  bidPrice1;
private boolean  isYear;

JSONObject get

auctionHouse = obj.getString("auctionHouse");
bidDate = obj.opt("bidDate");
bidPrice = obj.getInt("bidPrice");
bidPrice1 = obj.getDouble("bidPrice1");
isYear = obj.getBoolean("isYear");

JSONObject put

obj.put("auctionHouse",auctionHouse);
obj.put("bidDate",bidDate);
obj.put("bidPrice",bidPrice);
obj.put("bidPrice1",bidPrice1);
obj.put("isYear",isYear);
Foobnix
источник
этот ответ выглядит так тривиально. Существует автоматический способ создания pojo из json
Рафаэль Руис Табарес
0

Позвольте мне показать вам, как разработать инструмент. Вы можете сделать это:

  1. пользовательская функция javascript Json.parse (), создающая строку как-json для преобразования в объект js
  2. затем используйте этот объект для создания формата javabean.
  3. что-то , вы должны заботиться. (1) отображение типа значения, например, как выяснить строку, является типом даты. (2) loweser_case to camelCase

Я разработал инструмент, чтобы решить эту проблему. Это хороший дизайн и быстрый. получить код из моего github .

наслаждайтесь отсюда, я развернул его на веб-сервере .

Я пытаюсь ответить на вопрос из двух лучших ответов. Одна сеть не может открыться. Одна медленнее, чем мой инструмент. Надеюсь, вам понравится мой инструмент.

lizeyang
источник
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
Ахром