Java-Klasse aus JSON generieren?

215

Wie generieren Sie in einem Java Maven-Projekt Java-Quelldateien aus JSON? Zum Beispiel haben wir

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

Wenn wir laufen mvn generate-sources, wollen wir, dass es so etwas erzeugt:

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

Welche XML-Zeilen muss ich als Java-Entwickler in meine schreiben pom.xml, um dies zu erreichen?

Denis Palnitsky
quelle
Ich habe die Frage und Antwort aktualisiert, um sie zum Thema zu machen. Bitte wieder öffnen.
Alex R

Antworten:

269

Probieren Sie das Plug-In jsonschema2pojo aus:

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

Das <sourceType>json</sourceType>deckt den Fall ab, in dem die Quellen json sind (wie das OP). Wenn Sie aktuelle JSON- Schemas haben , entfernen Sie diese Zeile.

Aktualisiert im Jahr 2020. Zwei Dinge sind seit Dezember '09 passiert, als diese Frage gestellt wurde:

  • Die JSON-Schemaspezifikation hat sich stark weiterentwickelt. Es befindet sich noch im Entwurf (noch nicht fertiggestellt), steht jedoch kurz vor dem Abschluss und ist jetzt ein praktikables Werkzeug zur Festlegung Ihrer Strukturregeln

  • Ich habe kürzlich ein neues Open Source-Projekt gestartet, das speziell zur Lösung Ihres Problems gedacht ist : jsonschema2pojo . Das Tool jsonschema2pojo verwendet ein JSON-Schemadokument und generiert Java-Klassen im DTO-Stil (in Form von Java-Quelldateien). Das Projekt ist noch nicht ausgereift, deckt jedoch bereits die nützlichsten Teile des JSON-Schemas ab. Ich suche nach mehr Feedback von Benutzern, um die Entwicklung voranzutreiben. Im Moment können Sie das Tool über die Befehlszeile oder als Maven-Plugin verwenden.

Hoffe das hilft!

joelittlejohn
quelle
4
Müsste dann nicht jemand, der Ihr Tool jsonschema2pojo verwendet hat, eine eigene Schemadatei schreiben? Das OP bat darum, mit einer Json-Datei zu beginnen, nicht mit einem Schema. Gibt es ein Begleittool für Json -> Schema? Ich gehe davon aus, dass ein solches Tool, wenn es existiert, nur eine Vermutung liefern kann.
Jeff Axelrod
3
Ab Version 0.3.3 können Sie einfaches altes JSON als Eingabe verwenden :)
joelittlejohn
14
... und es gibt jetzt auch einen Online-Generator: jsonschema2pojo.org
joelittlejohn
2
Hervorragendes Werkzeug. Der bereitgestellte Link enthält ein Online-Tool, mit dem Sie Beispiel-JSON einfügen, auf eine Schaltfläche klicken und die Java-Quelle abrufen können.
mbmast
1
@testerjoe Wenn Sie Java-Quellcode meinen, dann tut dies ja jsonschema2pojo und es ist als Maven-Plugin, Ameisen-Task, Gradle-Erweiterung, CLI-Tool, Java-Bibliothek usw.
verfügbar.
21

Wenn Sie Jackson (die beliebteste Bibliothek dort) verwenden, versuchen Sie es

https://github.com/astav/JsonToJava

Es ist Open Source und jeder sollte dazu beitragen können.

Zusammenfassung

Ein JsonToJava-Quellklassendateigenerator, der das Schema basierend auf den bereitgestellten Json-Beispieldaten ableitet und die erforderlichen Java-Datenstrukturen generiert.

Es ermutigt die Teams, zuerst in Json zu denken, bevor sie den eigentlichen Code schreiben.

Eigenschaften

  • Kann Klassen für eine beliebig komplexe Hierarchie generieren (rekursiv)
  • Kann Ihre vorhandenen Java-Klassen lesen und wird es tun, wenn es in diese Strukturen deserialisiert werden kann
  • Fordert zur Benutzereingabe auf, wenn mehrdeutige Fälle vorliegen
Astav
quelle
13

Hier ist ein Online-Tool , das JSON verwendet, einschließlich verschachtelter Objekte oder verschachtelter Arrays von Objekten, und eine Java-Quelle mit Jackson-Annotationen generiert.

Tim Boudreau
quelle
1
Das hat bei mir auf Anhieb sehr gut funktioniert. Ich hatte tief verschachteltes JSON und es funktionierte gut, obwohl ich redundante Teile kürzen musste, um die Gesamtgröße unter 2k zu bringen. Ich konnte schreiben: MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (someURLthatReturnsJSON), MyClass.class); und die resultierenden Daten flossen perfekt. Ich musste all diese Jackson-Notationen entfernen, aber sonst funktionierte es gut für Gson. Danke dir.
Noogrub
Danke, es funktioniert. Wenn ich einen JSON mit Feldern mit Groß- und Kleinschreibung fütterte, gab diese Site ein Ergebnis zurück, während www.jsonschema2pojo.org einen Fehler meldete.
CoolMind
6

Beantwortung dieser alten Frage mit aktuellem Projekt ;-).

Im Moment ist die beste Lösung wahrscheinlich JsonSchema2Pojo :

Es erledigt die Arbeit mit dem selten verwendeten Json-Schema, aber auch mit einfachem Json. Es enthält das Ant and Maven-Plugin und eine Online-Testanwendung kann Ihnen einen Eindruck vom Tool vermitteln. Ich habe einen Json-Tweet eingefügt und die gesamte enthaltende Klasse (Tweet, Benutzer, Speicherort usw.) generiert.

Wir werden es im Agorava- Projekt verwenden, um Social Media-Mapping zu generieren und die Contant-Entwicklung in ihrer API zu verfolgen.

Antoine Sabot-Durand
quelle
Das ist auch mein Eindruck, aber ich habe das Maven-Plugin noch nicht ausprobiert, aber die Online-Version ist ziemlich langsam und stirbt für alles andere als die übliche Personenklasse ... Für eine schnelle Online-Konvertierung hat das Tool von @ tim-boudreau also am besten funktioniert mich.
Gregor
Ich habe JsonSchema2Pojo ausprobiert, aber wenn Sie auf die Schaltfläche Vorschau klicken, wird die leere Vorschau angezeigt.
AndroidDev
5

Vielen Dank an alle, die versucht haben zu helfen.
Für mich war dieses Skript hilfreich. Es verarbeitet nur flaches JSON und kümmert sich nicht um Typen, sondern automatisiert einige Routinen

  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("}");
Denis Palnitsky
quelle
5

Ich bin mir bewusst, dass dies eine alte Frage ist, aber ich bin darauf gestoßen, als ich versucht habe, selbst eine Antwort zu finden.

Die Antwort, in der der Online-Generator json-pojo (jsongen) erwähnt wird, ist gut, aber ich brauchte etwas, das ich über die Befehlszeile ausführen und mehr optimieren konnte.

Also habe ich ein sehr hackiges Ruby-Skript geschrieben, um eine JSON-Beispieldatei zu nehmen und daraus POJOs zu generieren. Es gibt eine Reihe von Einschränkungen (z. B. werden keine Felder behandelt, die mit von Java reservierten Schlüsselwörtern übereinstimmen), aber es reicht für viele Fälle aus.

Der standardmäßig generierte Code enthält Anmerkungen zur Verwendung mit Jackson, kann jedoch mit einem Schalter deaktiviert werden.

Sie finden den Code auf github: https://github.com/wotifgroup/json2pojo

Chris R.
quelle
2

Soweit ich weiß, gibt es kein solches Werkzeug. Noch.

Ich vermute, der Hauptgrund ist, dass es im Gegensatz zu XML (mit XML-Schema und Tools wie 'xjc', um das zu tun, was Sie verlangen, zwischen XML- und POJO-Definitionen) keine Schemasprache mit allen Funktionen gibt. Es gibt ein JSON-Schema, das jedoch die tatsächlichen Typdefinitionen kaum unterstützt (konzentriert sich auf JSON-Strukturen). Daher wäre es schwierig, Java-Klassen zu generieren. Aber wahrscheinlich noch möglich, insb. wenn einige Namenskonventionen definiert und zur Unterstützung der Generierung verwendet wurden.

Allerdings: Dies wurde ziemlich häufig angefordert (auf Mailinglisten von JSON-Toolprojekten, denen ich folge), daher denke ich, dass jemand in naher Zukunft ein solches Tool schreiben wird.

Ich denke also nicht, dass es per se eine schlechte Idee ist (auch: Es ist nicht für alle Anwendungsfälle eine gute Idee, hängt davon ab, was Sie tun möchten).

StaxMan
quelle
2

Ich hatte das gleiche Problem und beschloss, ein kleines Tool zu schreiben, um mir dabei zu helfen. Ich werde es teilen und Open Source.

https://github.com/BrunoAlexandreMendesMartins/CleverModels

Es unterstützt JAVA, C # und Objective-c von JSON.

Fühlen Sie sich frei, einen Beitrag zu leisten!

ehanoc
quelle
2

Sie können auch die GSON-Bibliothek ausprobieren. Es ist ziemlich leistungsfähig und kann JSON aus Sammlungen, benutzerdefinierten Objekten erstellen und funktioniert auch umgekehrt. Es wurde unter Apache License 2.0 veröffentlicht, sodass Sie es auch kommerziell nutzen können.

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

MB.One
quelle
13
erstellt keine Java-Definitionen
Nekromant
3
Darum geht es in der Frage nicht
hüpfen Sie
0

Zum Beitrag von @ japher hinzufügen. Wenn Sie nicht besonders an JSON gebunden sind, sollten Sie sich die Protokollpuffer ansehen .

dgorissen
quelle
1
Protokollpuffer sind nicht einmal annähernd eine Antwort darauf, wie Java-Objekte aus JSON erstellt werden. Zumindest sollten Sie ein Tool zum Erstellen von Java-Objekten aus Protokollpuffern empfohlen haben.
James.garriss
0

Probieren Sie meine Lösung aus

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
}

Ergebnis Java Class

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

JSONObject bekommen

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

JSONObject setzen

obj.put("auctionHouse",auctionHouse);
obj.put("bidDate",bidDate);
obj.put("bidPrice",bidPrice);
obj.put("bidPrice1",bidPrice1);
obj.put("isYear",isYear);
Foobnix
quelle
Diese Antwort sieht so trivial aus. Es gibt eine automatische Möglichkeit, Pojo aus Json zu generieren
Rafael Ruiz Tabares
0

Lassen Sie mich Ihnen zeigen, wie Sie das Tool entwickeln. Sie können dies tun:

  1. Benutzer Javascript-Funktion Json.parse (), machen Zeichenfolge like-json trans zu js Objekt
  2. Verwenden Sie dann dieses Objekt, um das Javabean-Format zu generieren.
  3. Etwas, das Sie interessieren sollten. (1) Die Zuordnung des Werttyps, zum Beispiel, wie man die Zeichenfolge herausfindet, ist der Datumstyp. (2) loweser_case to camelCase

Ich entwickle ein Tool, um das Problem zu lösen. Es ist gut gestaltet und schnell mehr. Holen Sie sich den Code von meinem Github .

genieße es von hier aus, ich habe es auf dem Webserver bereitgestellt .

Ich versuche den Vorschlag der Top-2-Antwort. Ein Web kann nicht geöffnet werden. Eines ist langsamer als mein Tool. Ich hoffe, Sie werden mein Tool genießen.

lizeyang
quelle
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.
Achrome