JSON Java sınıfı oluşturmak?


216

Java Maven projesinde, JSON'dan java kaynak dosyalarını nasıl oluşturursunuz? Örneğin,

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

Koştuğumuzda mvn generate-sourcesbunun gibi bir şey üretmesini istiyoruz:

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

Bir Java geliştiricisi olarak, bunun gerçekleşmesi için hangi XML satırlarını yazmam gerekir pom.xml?


Onları konuyla ilgili yapmak için soruyu ve cevabı güncelledim. Lütfen tekrar açın.
Alex R

Yanıtlar:


270

Jsonschema2pojo eklentisini deneyin :

        <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>Kapaklar kaynakları (OP gibi) json vardır olgusu. Gerçek json şemalarınız varsa , bu satırı kaldırın.

Bu soru sorulduğunda Aralık '09'dan bu yana iki şey oldu:

  • JSON Şema Spec bir sürü taşındı. Hala taslak halinde (kesinleşmiş değil) ama tamamlanmaya yakın ve şimdi yapısal kurallarınızı belirleyen uygun bir araç

  • Son zamanlarda özellikle sorununuzu çözmeyi amaçlayan yeni bir açık kaynak projesi başlattım: jsonschema2pojo . Jsonschema2pojo aracı bir json şema belgesi alır ve DTO tarzı Java sınıfları (.java kaynak dosyaları biçiminde) oluşturur. Proje henüz olgun değil ancak zaten json şemasının en yararlı kısımlarını kapsamaktadır. Geliştirmeyi desteklemeye yardımcı olmak için kullanıcılardan daha fazla geri bildirim arıyorum. Şu anda aracı komut satırından veya Maven eklentisi olarak kullanabilirsiniz.

Bu yardımcı olur umarım!


4
Jsonschema2pojo aracınızı kullanan birisinin kendi şema dosyasını yazması gerekmez mi? OP bir şema ile değil, bir Json dosyasıyla başlamasını istedi. Json -> Schema'dan gitmek için eşlik eden bir araç var mı? Böyle bir aracın, eğer varsa, sadece bir tahmin sağlayabileceğini varsayıyorum.
Jeff Axelrod

3
0.3.3 sürümünden itibaren giriş olarak düz eski JSON kullanabilirsiniz :)
joelittlejohn

14
... ve şimdi de çevrimiçi bir jeneratör var: jsonschema2pojo.org
joelittlejohn

2
Mükemmel bir araç. Sağlanan bağlantı, örnek JSON'a yapıştırabileceğiniz, bir düğmeyi tıklayabileceğiniz ve Java kaynağı alabileceğiniz çevrimiçi bir araç içerir.
mbmast

1
Java kaynak kodunu anlamına @testerjoe, o zaman evet jsonschema2pojo ... bunu yapar ve bir maven plugin, ant görevi, gradle uzantısı, CLI aracı, java kütüphane, vb kullanılabilir
joelittlejohn

21

Jackson'ı (oradaki en popüler kütüphane) kullanıyorsanız,

https://github.com/astav/JsonToJava

Açık kaynağı ve herkes katkıda bulunabilmelidir.

özet

Sağlanan örnek json verilerine dayanarak şemayı çıkaran ve gerekli java veri yapılarını üreten bir JsonToJava kaynak sınıfı dosya oluşturucusu.

Gerçek kodu yazmadan önce ekipleri önce Json'da düşünmeye teşvik eder.

Özellikleri

  • Rasgele karmaşık bir hiyerarşi için sınıflar oluşturabilir (yinelemeli olarak)
  • Mevcut Java sınıflarınızı okuyabilir ve bu yapılarda serileştirme yapabiliyorsa,
  • Belirsiz durumlar olduğunda kullanıcı girişi istenir

13

İşte bir var çevrimiçi bir araç , JSON almak yuvalanmış nesneler veya nesnelerin iç içe diziler de dahil olmak üzere ve Jackson ek açıklamalarla bir Java kaynağını oluşturur.


1
İlk seferde bu benim için çok iyi çalıştı. Ben derinden iç içe JSON vardı ve her ne kadar genel boyutu 2k altında almak için gereksiz bölümleri kırpmak zorunda, ancak iyi çalıştı. Yazmamı sağladı: MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (someURLthatReturnsJSON), Sınıfım.class); ve elde edilen veriler mükemmel bir şekilde aktı. Tüm bu Jackson gösterimlerini kaldırmak zorunda kaldım, ama aksi takdirde gson için iyi çalıştı. Teşekkür ederim.
noogrub

Teşekkürler, işe yarıyor. Bir JSON'u büyük / küçük harfe duyarlı alanlarla beslediğimde, bu site bir sonuç döndürürken, www.jsonschema2pojo.org bir hata bildirdi.
CoolMind

6

Bu eski soruyu son proje ;-) ile cevaplamak.

Şu anda en iyi çözüm muhtemelen JsonSchema2Pojo :

Nadiren kullanılan Json Schema'nın işini değil, aynı zamanda sade Json ile de yapar. Ant ve Maven eklentisi sağlar ve çevrimiçi bir test uygulaması size araç hakkında bir fikir verebilir. Ben bir Json Tweet koymak ve içeren tüm sınıf (Tweet, Kullanıcı, Yer, vb ..) oluşturdu.

Agorava projesinde Sosyal Medya haritalaması oluşturmak ve API'larındaki sürekli evrimi takip etmek için kullanacağız .


Bu da benim izlenimim, ama Maven eklentisini henüz denemedim, ancak çevrimiçi sürüm oldukça yavaş ve normal Kişi sınıfından başka bir şey için ölüyor ... Yani hızlı çevrimiçi dönüşüm için @ tim-boudreau'nun aracı en iyi şekilde çalıştı ben mi.
Gregor

JsonSchema2Pojo'yu denedim ama Önizleme düğmesine basmak boş önizlemeyi açıyor.
AndroidDev

5

Yardım etmeye çalışan herkese teşekkürler.
Benim için bu senaryo yardımcı oldu. Sadece düz JSON'u işler ve türlerle ilgilenmez, ancak bazı rutinleri otomatik hale getirir

  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

Bunun eski bir soru olduğunun farkındayım, ama kendime bir cevap bulmaya çalışırken karşılaştım.

Çevrimiçi json-pojo jeneratörünün (jsongen) bahsettiği cevap iyidir, ama komut satırında çalışıp daha fazla ayarlayabileceğim bir şeye ihtiyacım vardı.

Bu yüzden örnek bir JSON dosyası alıp POJO'ları oluşturmak için çok hacky bir yakut komut dosyası yazdım. Bazı sınırlamaları vardır (örneğin, java ayrılmış anahtar kelimelerle eşleşen alanlarla ilgilenmez), ancak birçok durum için yeterlidir.

Oluşturulan kod, varsayılan olarak Jackson ile kullanım için açıklama ekler, ancak bu bir anahtarla kapatılabilir.

Kodu github'da bulabilirsiniz: https://github.com/wotifgroup/json2pojo


2

Bildiğim kadarıyla böyle bir araç yok. Hala.

Ana nedeni, XML'den farklı olarak (XML Şeması ve daha sonra XML ve POJO tanımları arasında istediğinizi yapmak için 'xjc' gibi araçlar), şema dilinin tam özelliklerinin bulunmadığından şüpheleniyorum. JSON Şeması var, ancak gerçek tür tanımları için çok az destek var (JSON yapılarına odaklanıyor), bu nedenle Java sınıfları oluşturmak zor olacaktır. Ama muhtemelen hala mümkün, esp. bazı adlandırma kuralları tanımlanmış ve üretimi desteklemek için kullanılmışsa.

Ancak: bu oldukça sık talep edilen bir şeydir (takip ettiğim JSON aracı projelerinin posta listelerinde), bu yüzden birinin yakın gelecekte böyle bir araç yazacağını düşünüyorum.

Bu yüzden bunun kendi başına kötü bir fikir olduğunu düşünmüyorum (ayrıca: tüm kullanım durumları için iyi bir fikir değildir, ne yapmak istediğinize bağlıdır).



2

GSON kütüphanesini de deneyebilirsiniz. Oldukça güçlü koleksiyonlardan JSON oluşturabilir, özel nesneler ve tersi de çalışır. Apache License 2.0 altında piyasaya sürüldü, böylece ticari olarak da kullanabilirsiniz.

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


13
java tanımları yaratmaz
necromancer

3
Sorunun konusu bu değil
hop


0

@ Japher'un gönderisine eklemek için. Özellikle JSON'a bağlı değilseniz, Protokol Tamponları kontrol etmeye değer.


1
Protokol Tamponları, JSON'dan Java nesnelerinin nasıl oluşturulacağına dair bir cevaba bile yakın değildir. En azından Protokol Tamponlarından Java Nesneleri oluşturmak için bir araç tavsiye etmelisiniz.
james.garriss

0

Çözümümü dene

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
}

Sonuç Java Sınıfı

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 koymak

obj.put("auctionHouse",auctionHouse);
obj.put("bidDate",bidDate);
obj.put("bidPrice",bidPrice);
obj.put("bidPrice1",bidPrice1);
obj.put("isYear",isYear);

bu cevap çok önemsiz görünüyor. Json dan pojo üretmek için otomatik bir yolu yoktur
Rafael Ruiz Tabares

0

Size aracı nasıl geliştireceğinizi göstereyim.

  1. kullanıcı javascript işlevi Json.parse (), js nesnesi gibi-json trans dizesi yapmak
  2. sonra javabean biçimini oluşturmak için bu nesneyi kullanın.
  3. (1) değer türü eşleme, örnek, dizenin nasıl hesaplanacağı, tarih türüdür. (2) loweser_case - camelCase

Sorunu çözmek için bir araç geliştiriyorum. İyi tasarım ve daha hızlı. kodu github'dan al .

buradan zevk, ben web sunucusunda dağıtmak var .

Ben ilk 2 cevap öneri deneyin. Bir web açılamıyor. Bir benim aracı daha yavaş. Umarım benim aracı zevk.


Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
Achrome
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.