Wygenerować klasę Java z JSON?

215

Jak w projekcie Java Maven generujesz pliki źródłowe Java z JSON? Na przykład mamy

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

Po uruchomieniu mvn generate-sourceschcemy, aby wygenerowało coś takiego:

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

Jako programista Java, jakie wiersze XML muszę napisać pom.xml, aby tak się stało?

Denis Palnicki
źródło
Zaktualizowałem pytanie i odpowiedź, aby były tematyczne. Proszę ponownie otworzyć.
Alex R

Odpowiedzi:

269

Wypróbuj wtyczkę 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>

W <sourceType>json</sourceType>dotyczy przypadku, w którym źródła są json (jak PO). Jeśli masz rzeczywiste schematy Json , usuń tę linię.

Zaktualizowano w 2020 r. Dwie rzeczy wydarzyły się od grudnia 2009 r., Kiedy zadano to pytanie:

  • Specyfikacja schematu JSON bardzo się zmieniła. Nadal jest w wersji roboczej (nie sfinalizowanej), ale jest prawie gotowy do ukończenia i jest teraz realnym narzędziem określającym twoje zasady strukturalne

  • Niedawno rozpocząłem nowy projekt open source, którego celem jest rozwiązanie twojego problemu: jsonschema2pojo . Narzędzie jsonschema2pojo pobiera dokument schematu json i generuje klasy Java w stylu DTO (w postaci plików źródłowych .java). Projekt nie jest jeszcze dojrzały, ale już zapewnia pokrycie najbardziej użytecznych części schematu json. Szukam więcej opinii od użytkowników, aby pomóc w rozwoju. W tej chwili możesz używać narzędzia z wiersza poleceń lub jako wtyczki Maven.

Mam nadzieję że to pomoże!

joelittlejohn
źródło
4
Czy ktoś, kto używał twojego narzędzia jsonschema2pojo, nie musiałby wtedy pisać własnego pliku schematu? OP poprosił o rozpoczęcie od pliku Json, a nie schematu. Czy jest dostępne narzędzie towarzyszące z Json -> Schemat? Zakładam, że takie narzędzie, jeśli istniałoby, mogłoby jedynie dać przypuszczenie.
Jeff Axelrod
3
Począwszy od wersji 0.3.3, możesz używać zwykłego starego JSON jako danych wejściowych :)
joelittlejohn
14
... i teraz jest też generator online: jsonschema2pojo.org
joelittlejohn
2
Doskonałe narzędzie. Podany link zawiera narzędzie online, w którym można wkleić przykładowy JSON, kliknąć przycisk i pobrać źródło Java.
mbmast
1
@testerjoe Jeśli masz na myśli kod źródłowy Java, to tak robi jsonschema2pojo i jest on dostępny jako wtyczka maven, zadanie ant, rozszerzenie klasy, narzędzie CLI, biblioteka Java itp.
joelittlejohn
21

Jeśli używasz Jacksona (najpopularniejszej biblioteki), spróbuj

https://github.com/astav/JsonToJava

Jest to oprogramowanie typu open source i każdy powinien mieć możliwość wniesienia wkładu.

Podsumowanie

Generator plików klas źródłowych JsonToJava, który dedukuje schemat na podstawie dostarczonych przykładowych danych Json i generuje niezbędne struktury danych Java.

Zachęca zespoły do ​​myślenia w Jsonie, a dopiero potem do napisania właściwego kodu.

cechy

  • Potrafi generować klasy dla dowolnej złożonej hierarchii (rekurencyjnie)
  • Potrafi czytać istniejące klasy Java i jeśli może przekształcić te struktury w postaci szeregowe, zrobi to
  • Poprosi użytkownika o podanie danych, gdy istnieją niejednoznaczne przypadki
Astav
źródło
13

Oto narzędzie online, które pobierze JSON, w tym zagnieżdżone obiekty lub zagnieżdżone tablice obiektów i wygeneruje źródło Java z adnotacjami Jacksona.

Tim Boudreau
źródło
1
Za pierwszym razem działało to dla mnie bardzo dobrze. Głęboko zagnieździłem JSON i działało dobrze, chociaż musiałem przyciąć zbędne części, aby uzyskać ogólny rozmiar poniżej 2k. Umożliwiłem mi pisać: MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (someURLthatReturnsJSON), MyClass.class); a dane wynikowe przepłynęły idealnie. Musiałem usunąć wszystkie notacje Jacksona, ale poza tym działało to dobrze dla gson. Dziękuję Ci.
noogrub
Dzięki, działa. Kiedy nakarmiłem JSON polami, w których rozróżniana jest wielkość liter, ta strona zwróciła wynik, a www.jsonschema2pojo.org zgłosił błąd.
CoolMind,
6

Odpowiadając na to stare pytanie w ostatnim projekcie ;-).

W tej chwili najlepszym rozwiązaniem jest prawdopodobnie JsonSchema2Pojo :

Robi to zadanie od rzadko używanego schematu Jsona, ale także ze zwykłym Jsonem. Zapewnia wtyczkę Ant i Maven, a aplikacja testowa online może dać ci wyobrażenie o narzędziu. Wstawiłem Json Tweet i wygenerowałem całą zawartą w nim klasę (Tweet, Użytkownik, Lokalizacja itp.).

Wykorzystamy go w projekcie Agorava do wygenerowania mapowania mediów społecznościowych i śledzenia ciągłej ewolucji ich interfejsu API.

Antoine Sabot-Durand
źródło
Takie też mam wrażenie, ale nie wypróbowałem jeszcze wtyczki Maven, jednak wersja online jest dość wolna i umiera na coś innego niż zwykła klasa Person ... Więc w przypadku szybkiej konwersji online narzędzie @ tim-boudreau działało najlepiej dla mnie.
Gregor,
Próbowałem JsonSchema2Pojo, ale naciśnięcie przycisku Podgląd powoduje wyświetlenie pustego podglądu.
AndroidDev,
5

Dziękuję wszystkim, którzy próbowali pomóc.
Dla mnie ten skrypt był pomocny. Przetwarza tylko płaskie JSON i nie zajmuje się typami, ale automatyzuje niektóre rutyny

  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 Palnicki
źródło
5

Wiem, że to stare pytanie, ale natknąłem się na nie, próbując samemu znaleźć odpowiedź.

Odpowiedź, która wspomina o internetowym generatorze json-pojo (jsongen), jest dobra, ale potrzebowałem czegoś, co mógłbym uruchomić w wierszu poleceń i poprawić.

Napisałem więc bardzo zepsuty skrypt ruby, aby pobrać przykładowy plik JSON i wygenerować z niego POJO. Ma wiele ograniczeń (na przykład nie obsługuje pól pasujących do słów kluczowych zarezerwowanych dla języka Java), ale wystarcza w wielu przypadkach.

Generowany kod domyślnie zawiera adnotacje do użycia z Jacksonem, ale można to wyłączyć za pomocą przełącznika.

Możesz znaleźć kod na github: https://github.com/wotifgroup/json2pojo

Chris R.
źródło
2

O ile mi wiadomo, nie ma takiego narzędzia. Jeszcze.

Podejrzewam, że głównym powodem jest to, że w przeciwieństwie do XML (który ma schemat XML, a następnie narzędzia takie jak „xjc” do robienia tego, o co prosisz, pomiędzy definicjami XML i POJO), nie ma w pełni funkcjonalnego języka schematu. Istnieje schemat JSON, ale ma on bardzo małe wsparcie dla rzeczywistych definicji typów (koncentruje się na strukturach JSON), więc wygenerowanie klas Java byłoby trudne. Ale prawdopodobnie nadal możliwe, zwłaszcza. jeśli niektóre konwencje nazewnictwa zostały zdefiniowane i wykorzystane do obsługi generowania.

Jednak: jest to coś, o co dość często proszono (na listach mailingowych projektów narzędzi JSON, które obserwuję), więc myślę, że ktoś napisze takie narzędzie w najbliższej przyszłości.

Nie sądzę więc, aby sam był to zły pomysł (również: nie jest to dobry pomysł dla wszystkich przypadków użycia, zależy od tego, co chcesz zrobić).

StaxMan
źródło
2

Możesz także wypróbować bibliotekę GSON. Jest dość potężny, że może tworzyć JSON ze zbiorów, obiektów niestandardowych i działa również na odwrót. Jest wydany na licencji Apache License 2.0, dzięki czemu można go również używać komercyjnie.

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

MB.Jeden
źródło
13
nie tworzy definicji java
nekromanta
3
Nie o to chodzi w pytaniu
hop
0

Aby dodać do posta @ japher. Jeśli nie jesteś szczególnie przywiązany do JSON, warto sprawdzić bufory protokołów .

dgorissen
źródło
1
Bufory protokołów nie są nawet bliskie odpowiedzi na pytanie, jak tworzyć obiekty Java z JSON. Przynajmniej powinieneś polecić narzędzie do tworzenia obiektów Java z buforów protokołów.
james.garriss
0

Wypróbuj moje rozwiązanie

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
}

Wynikowa klasa 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);
Foobnix
źródło
ta odpowiedź wygląda tak trywialnie. Istnieje automatyczny sposób generowania pojo z json
Rafael Ruiz Tabares
0

Pozwól, że pokażę ci, jak zaprojektować narzędzie. Możesz to zrobić:

  1. funkcja javascript użytkownika Json.parse (), przekształca ciąg znaków jak-json w obiekt js
  2. następnie użyj tego obiektu do wygenerowania formatu javabean.
  3. coś, nie przejmuj się. (1) mapowanie typu wartości, na przykład, jak obliczyć ciąg, to typ daty. (2) loweser_case to camelCase

Opracowuję narzędzie, które rozwiązuje problem. Jest dobrze zaprojektowane i szybkie. pobierz kod z mojego github .

ciesz się stąd, wdrożyłem go na serwerze internetowym .

Wypróbowuję sugestię z 2 najlepszych odpowiedzi. Jedna strona nie może się otworzyć. Jedna jest wolniejsza niż moje narzędzie. Mam nadzieję, że spodoba ci się moje narzędzie.

lizeyang
źródło
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
Achrome,