Створити клас Java від JSON?


215

Як у проекті 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, щоб це відбулося?


Я оновив питання та відповідь, щоб зробити їх теми. Відкрийте, будь ласка.
Алекс R

Відповіді:


269

Спробуйте плагін 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 році. Починаючи з цього запитання, сталося дві речі:

  • Специфікація схеми JSON значно змінилася. Він ще в чернеті (не доопрацьований), але він до кінця завершується і тепер є життєздатним інструментом, що визначає ваші структурні правила

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

Сподіваюсь, це допомагає!


4
Невже хтось, хто використовував ваш інструмент jsonschema2pojo, не повинен писати свій власний файл схеми? ОП попросив почати з файлу Json, а не схеми. Чи є інструмент-супутник для переходу з Json -> Schema? Я припускаю, що такий інструмент, якби він існував, міг би лише дати здогад.
Джефф Аксельрод

3
З версії 0.3.3 ви можете використовувати звичайний старий JSON як вхід :)
joelittlejohn

14
... і зараз є також онлайн-генератор: jsonschema2pojo.org
joelittlejohn

2
Відмінний інструмент. Додане посилання містить онлайн-інструмент, де ви можете вставити зразок JSON, натиснути кнопку та отримати джерело Java.
mbmast

1
@testerjoe Якщо ви маєте на увазі вихідний код Java, то так, jsonschema2pojo робить це, і він доступний як плагін Maven, завдання мурашки, розширення gradle, інструмент CLI, бібліотека Java та інше ...
joelittlejohn

21

Якщо ви використовуєте Джексона (найпопулярніша бібліотека там), спробуйте

https://github.com/astav/JsonToJava

Його відкритий код і кожен бажаючий повинен мати можливість зробити свій внесок.

Підсумок

Генератор файлів вихідного класу JsonToJava, який виводить схему на основі наданих зразків даних json та генерує необхідні структури даних Java.

Це спонукає команди спочатку подумати над Json, перш ніж писати фактичний код.

Особливості

  • Може генерувати класи для довільно складної ієрархії (рекурсивно)
  • Може читати наявні ваші класи Java, і якщо вона може дезаріалізуватися в ці структури, зробить це
  • Підкаже про введення користувачем, коли існують неоднозначні випадки

13

Ось онлайн-інструмент, який буде приймати JSON, включаючи вкладені об’єкти або вкладені масиви об’єктів та генерувати джерело Java з анотаціями Джексона.


1
Це дуже добре працювало для мене на першому ж шляху. Я глибоко вклав JSON, і він працював чудово, хоча мені довелося обрізати зайві частини, щоб отримати загальний розмір нижче 2k. Дозволено мені написати: MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (деякийURLthatReturnsJSON), MyClass.class); і отримані дані протікали ідеально. Мені довелося видалити всі ці позначення Джексона, але в іншому випадку це спрацювало нормально для gson. Дякую.
noogrub

Дякую, це працює. Коли я передавав JSON полями з урахуванням регістру, цей сайт повернув результат, тоді як www.jsonschema2pojo.org повідомив про помилку.
CoolMind

6

Відповідаючи на це старе питання нещодавним проектом ;-).

На даний момент найкращим рішенням є, мабуть, JsonSchema2Pojo :

Він виконує роботу за рідко використовуваною схемою Джсона, але також і з простим Json. Він пропонує плагін Ant і Maven, а онлайн-тестова програма може дати вам уявлення про інструмент. Я помістив Json Tweet і генерував весь клас, що містить (Tweet, користувач, місцеположення тощо).

Ми будемо використовувати його в проекті 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), є доброю, але мені було потрібно щось, що я міг би запустити в командному рядку та ще більше налаштувати.

Тому я написав дуже хакітний рубіновий сценарій, щоб взяти зразок файлу JSON та генерувати з нього POJO. Він має ряд обмежень (наприклад, він не стосується полів, які відповідають зарезервованим ключовим словам Java), але цього достатньо для багатьох випадків.

Код, створений за замовчуванням, коментує використання Джексона, але це можна вимкнути за допомогою перемикача.

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


2

Наскільки мені відомо, такого інструменту немає. І все-таки.

Основна причина полягає в тому, що я підозрюю, що на відміну від XML (який має XML-схему, а потім такі інструменти, як 'xjc', щоб робити те, що ви просите, між визначеннями XML та POJO), не існує повністю функціональної мови схеми. Існує схема JSON, але вона має дуже малу підтримку фактичних визначень типів (фокусується на структурах JSON), тому було б складно створювати класи Java. Але, мабуть, все-таки можливо, особливо. якщо були визначені деякі умови іменування та використовуються для підтримки генерації.

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

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


2

У мене була така ж проблема, тому я вирішив почати писати невеликий інструмент, щоб допомогти мені в цьому. Я буду ділитися та відкрити його джерело.

https://github.com/BrunoAlexandreMendesMartins/CleverModels

Він підтримує JAVA, C # & Objective-c від JSON.

Не соромтеся робити внесок!


2

Ви також можете спробувати бібліотеку GSON. Його досить потужний, він може створювати JSON з колекцій, користувацьких об'єктів і працює також навпаки. Його випускають під ліцензією Apache License 2.0, щоб ви могли також використовувати його і комерційно.

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


13
не створює визначення java
necromancer

3
Про це не йдеться
скакайте

1

Я створив проект github Json2Java, який робить це. https://github.com/inder123/json2java

Json2Java забезпечує налаштування, такі як перейменування полів та створення ієрархій успадкування.

Я використовував інструмент для створення деяких відносно складних API:

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

API геокодування Google Maps: https://github.com/inder123/geocoding


0

Щоб додати до публікації @ japher Якщо ви не особливо прив’язані до JSON, буфери протоколів варто перевірити.


1
Буфер протоколів навіть не відповідає відповіді про те, як створити об'єкти 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

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

JSONObject отримати

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);

ця відповідь виглядає настільки банально. Існує автоматичний спосіб генерувати pojo з json
Рафаель Руїз Табарес

0

Дозвольте мені показати вам, як розробити інструмент. Ви можете це зробити:

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

Я розробив інструмент, щоб вирішити проблему. Це добре дизайн та швидше. отримати код від мого github .

насолоджуйся звідси, я розгорнув його на веб-сервері .

Я спробую топ-2 відповіді на пропозицію. Одна веб-сторінка не може відкритись. Хтось повільніше мого інструменту


Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
Ахром
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.