Generare classe Java da JSON?


216

In un progetto Java Maven, come si generano i file sorgente Java da JSON? Per esempio abbiamo

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

Quando corriamo mvn generate-sourcesvogliamo che generi qualcosa del genere:

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

Come sviluppatore Java, quali righe di XML devo scrivere nel mio pom.xmlper farlo accadere?


Ho aggiornato la domanda e la risposta per renderli sull'argomento. Si prega di riaprire.
Alex R

Risposte:


270

Prova il plug-in 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>

Le <sourceType>json</sourceType>coperture caso in cui le sorgenti sono json (come il PO). Se hai schemi json reali , rimuovi questa riga.

Aggiornato nel 2020. Dal dicembre 2009 sono successe due cose quando è stata posta questa domanda:

  • Le specifiche dello schema JSON sono cambiate molto. È ancora in bozza (non finalizzato) ma è vicino al completamento ed è ora uno strumento praticabile che specifica le regole strutturali

  • Di recente ho avviato un nuovo progetto open source appositamente progettato per risolvere il tuo problema: jsonschema2pojo . Lo strumento jsonschema2pojo accetta un documento di schema json e genera classi Java in stile DTO (sotto forma di file di origine .java). Il progetto non è ancora maturo ma fornisce già una copertura delle parti più utili dello schema json. Sto cercando più feedback dagli utenti per aiutare a guidare lo sviluppo. In questo momento puoi usare lo strumento dalla riga di comando o come plugin Maven.

Spero che questo ti aiuti!


4
Qualcuno che ha usato il tuo strumento jsonschema2pojo non avrebbe dovuto scrivere il proprio file di schema allora? L'OP ha chiesto di iniziare con un file Json, non uno schema. Esiste uno strumento di accompagnamento per passare da Json -> Schema? Suppongo che un tale strumento, se esistesse, potrebbe solo fornire un'ipotesi.
Jeff Axelrod,

3
Dalla versione 0.3.3, puoi usare il semplice vecchio JSON come input :)
joelittlejohn,

14
... e ora c'è anche un generatore online: jsonschema2pojo.org
joelittlejohn,

2
Strumento eccellente. Il collegamento fornito contiene uno strumento online in cui è possibile incollare nel JSON di esempio, fare clic su un pulsante e ottenere l'origine Java.
mbmast,

1
@testerjoe Se intendi il codice sorgente Java, allora sì jsonschema2pojo lo fa, ed è disponibile come plug-in Mven, task formica, estensione gradle, strumento CLI, libreria java, ecc ...
joelittlejohn

21

Se stai usando Jackson (la libreria più popolare lì), prova

https://github.com/astav/JsonToJava

È open source e chiunque dovrebbe essere in grado di contribuire.

Sommario

Un generatore di file di classe di origine JsonToJava che deduce lo schema in base ai dati json di esempio forniti e genera le strutture di dati java necessarie.

Incoraggia i team a pensare prima in Json, prima di scrivere il codice reale.

Caratteristiche

  • Può generare classi per una gerarchia arbitrariamente complessa (ricorsivamente)
  • Può leggere le tue classi Java esistenti e se può deserializzare in quelle strutture, lo farà
  • Richiederà l'input dell'utente in presenza di casi ambigui

13

Ecco uno strumento online che prenderà JSON, inclusi oggetti nidificati o matrici nidificate di oggetti e genererà una sorgente Java con annotazioni Jackson.


1
Questo ha funzionato molto bene per me al primo tentativo. Avevo profondamente annidato JSON e ha funzionato bene, anche se ho dovuto tagliare porzioni ridondanti per ottenere una dimensione complessiva inferiore a 2k. Mi ha permesso di scrivere: MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (someURLthatReturnsJSON), MyClass.class); e i dati risultanti scorrevano perfettamente. Ho dovuto rimuovere tutte quelle notazioni di Jackson, ma per il resto ha funzionato bene per Gson. Grazie.
Noogrub,

Grazie, funziona Quando ho inviato un JSON con campi sensibili al maiuscolo / minuscolo, questo sito ha restituito un risultato, mentre www.jsonschema2pojo.org ha segnalato un errore.
CoolMind,

6

Rispondere a questa vecchia domanda con un recente progetto ;-).

Al momento la soluzione migliore è probabilmente JsonSchema2Pojo :

Fa il lavoro dal Json Schema usato di rado ma anche con il semplice Json. Fornisce plug-in Ant e Maven e un'applicazione di test online può darti un'idea dello strumento. Ho inserito un Tweet Json e generato tutta la classe contenente (Tweet, Utente, Posizione, ecc.).

Lo useremo sul progetto Agorava per generare la mappatura dei social media e seguire l'evoluzione contante nella loro API.


Questa è anche la mia impressione, ma non ho ancora provato il plugin Maven, tuttavia la versione online è piuttosto lenta e muore per qualcosa di diverso dalla solita classe Person ... Quindi per una rapida conversione online, lo strumento di @ tim-boudreau ha funzionato meglio per me.
Gregor,

Ho provato JsonSchema2Pojo ma premendo il pulsante Anteprima si apre l'anteprima vuota.
AndroidDev,

5

Grazie a tutti coloro che hanno tentato di aiutare.
Per me questo script è stato utile. Elabora solo JSON flat e non si occupa dei tipi, ma automatizza alcune routine

  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

Sono consapevole che questa è una vecchia domanda, ma mi sono imbattuto in esso mentre cercavo di trovare una risposta.

La risposta che menziona il generatore di json-pojo online (jsongen) è buona, ma avevo bisogno di qualcosa che potessi eseguire sulla riga di comando e modificare di più.

Così ho scritto uno script ruby ​​molto confuso per prendere un file JSON di esempio e generare POJO da esso. Ha una serie di limitazioni (ad esempio, non si occupa di campi che corrispondono a parole chiave riservate java) ma lo fa in molti casi.

Il codice generato, per impostazione predefinita, annota per l'uso con Jackson, ma questo può essere disattivato con un interruttore.

Puoi trovare il codice su github: https://github.com/wotifgroup/json2pojo


2

Per quanto ne so non esiste uno strumento del genere. Ancora.

Il motivo principale è, sospetto, che a differenza di XML (che ha XML Schema e quindi strumenti come 'xjc' per fare ciò che chiedi, tra definizioni XML e POJO), non esiste un linguaggio di schema con funzionalità complete. Esiste uno schema JSON, ma ha pochissimo supporto per le definizioni dei tipi effettivi (si concentra sulle strutture JSON), quindi sarebbe difficile generare classi Java. Ma probabilmente è ancora possibile, esp. se alcune convenzioni di denominazione sono state definite e utilizzate per supportare la generazione.

Tuttavia: questo è qualcosa che è stato richiesto abbastanza frequentemente (sulle mailing list dei progetti di strumenti JSON che seguo), quindi penso che qualcuno scriverà tale strumento in un prossimo futuro.

Quindi non penso che sia una cattiva idea di per sé (anche: non è una buona idea per tutti i casi d'uso, dipende da cosa vuoi fare).



2

Puoi anche provare la libreria GSON. È abbastanza potente che può creare JSON da raccolte, oggetti personalizzati e funziona anche viceversa. È rilasciato con licenza Apache 2.0 in modo da poterlo utilizzare anche commercialmente.

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


13
non crea definizioni java
negromante

3
Non è questo il problema
salta il


0

Da aggiungere al post di @japher. Se non sei particolarmente legato a JSON, vale la pena dare un'occhiata a Protocol Buffers .


1
Protocol Buffers non è nemmeno vicino a una risposta su come creare oggetti Java da JSON. Almeno avresti dovuto raccomandare uno strumento per la creazione di oggetti Java da protocol buffer.
james.garriss,

0

Prova la mia soluzione

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
}

Risultato Classe Java

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

questa risposta sembra così banale. Esiste un modo automatico per generare pojo da JSON
Rafael Ruiz Tabares,

0

Lascia che ti mostri come sviluppare lo strumento. Puoi farlo:

  1. funzione javascript dell'utente Json.parse (), crea una stringa like-json nell'oggetto js
  2. quindi usa questo oggetto per genificare il formato javabean.
  3. qualcosa , ti preoccupi. (1) la mappatura del tipo di valore, ad esempio, come capire la stringa, è il tipo di data. (2) loweser_case a camelCase

Sviluppo uno strumento per risolvere il problema. È ben progettato e veloce di più. ottenere il codice dal mio github .

divertiti da qui, l'ho implementato sul server web .

Provo il suggerimento delle 2 risposte principali. Un sito Web non è in grado di aprirsi. Uno è più lento del mio strumento. Spero che apprezzerai il mio strumento.


Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
Achrome,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.