Hasilkan kelas Java dari JSON?

215

Dalam proyek Java Maven, bagaimana Anda menghasilkan file sumber java dari JSON? Misalnya kita punya

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

Ketika kami menjalankan, mvn generate-sourceskami ingin menghasilkan sesuatu seperti ini:

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

Sebagai pengembang Java, baris XML apa yang harus saya tulis pom.xmluntuk membuat ini terjadi?

Denis Palnitsky
sumber
Saya telah memperbarui pertanyaan dan jawaban untuk menjadikannya sesuai topik. Harap buka kembali.
Alex R

Jawaban:

269

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

Yang <sourceType>json</sourceType>mencakup kasus di mana sumbernya adalah json (seperti OP). Jika Anda memiliki skema json yang sebenarnya , hapus baris ini.

Diperbarui pada tahun 2020. Dua hal telah terjadi sejak Dec '09 ketika pertanyaan ini diajukan:

  • The JSON Skema spek telah pindah banyak. Ini masih dalam konsep (tidak difinalisasi) tetapi hampir selesai dan sekarang merupakan alat yang layak menentukan aturan struktural Anda

  • Saya baru-baru ini memulai proyek open source baru yang khusus ditujukan untuk menyelesaikan masalah Anda: jsonschema2pojo . Alat jsonschema2pojo mengambil dokumen skema json dan menghasilkan kelas Java gaya-DTO (dalam bentuk file sumber .java). Proyek ini belum matang tetapi sudah menyediakan cakupan bagian yang paling berguna dari skema json. Saya mencari lebih banyak umpan balik dari pengguna untuk membantu mendorong pengembangan. Saat ini Anda dapat menggunakan alat dari baris perintah atau sebagai plugin Maven.

Semoga ini membantu!

joelittlejohn
sumber
4
Bukankah seseorang yang menggunakan alat jsonschema2pojo Anda harus menulis file skema sendiri? OP diminta untuk memulai dengan file Json, bukan skema. Apakah ada alat pendamping untuk berangkat dari Json -> Skema? Saya berasumsi bahwa alat seperti itu, jika ada, hanya bisa memberikan perkiraan.
Jeff Axelrod
3
Pada versi 0.3.3, Anda dapat menggunakan JSON tua biasa sebagai masukan :)
joelittlejohn
14
... dan sekarang ada generator online juga: jsonschema2pojo.org
joelittlejohn
2
Alat luar biasa. Tautan yang disediakan berisi alat online tempat Anda dapat menempelkan dalam sampel JSON, klik tombol dan dapatkan sumber Java.
mbmast
1
@testerjoe Jika maksud Anda kode sumber Java, maka ya jsonschema2pojo melakukan ini, dan tersedia sebagai plugin pakar, tugas semut, ekstensi gradle, alat CLI, perpustakaan java, dll ...
joelittlejohn
21

Jika Anda menggunakan Jackson (perpustakaan paling populer di sana), cobalah

https://github.com/astav/JsonToJava

Sumber terbuka dan siapa pun harus dapat berkontribusi.

Ringkasan

Generator file kelas sumber JsonToJava yang menyimpulkan skema berdasarkan data sampel json yang disediakan dan menghasilkan struktur data java yang diperlukan.

Ini mendorong tim untuk berpikir dalam Json terlebih dahulu, sebelum menulis kode aktual.

fitur

  • Dapat menghasilkan kelas untuk hierarki yang kompleks sewenang-wenang (secara rekursif)
  • Dapat membaca kelas Java Anda yang sudah ada dan jika bisa deserialize ke dalam struktur tersebut, akan melakukannya
  • Akan meminta input pengguna ketika ada kasus ambigu
Astav
sumber
13

Berikut adalah alat online yang akan mengambil JSON, termasuk objek bersarang atau array objek bersarang dan menghasilkan sumber Java dengan anotasi Jackson.

Tim Boudreau
sumber
1
Ini bekerja sangat baik untuk saya pada perjalanan pertama. Saya telah sangat bersarang JSON dan itu bekerja dengan baik, meskipun saya harus memotong bagian yang berlebihan untuk mendapatkan ukuran keseluruhan di bawah 2k. Memungkinkan saya untuk menulis: MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (someURLthatReturnsJSON), MyClass.class); dan data yang dihasilkan mengalir dengan sempurna. Saya harus menghapus semua notasi Jackson, tetapi jika tidak, itu berfungsi dengan baik untuk gson. Terima kasih.
noogrub
Terima kasih, ini berhasil. Ketika saya memberi makan JSON dengan bidang peka huruf besar-kecil, situs ini mengembalikan hasilnya, sementara www.jsonschema2pojo.org melaporkan kesalahan.
CoolMind
6

Menjawab pertanyaan lama ini dengan proyek terbaru ;-).

Saat ini solusi terbaik mungkin adalah JsonSchema2Pojo :

Itu pekerjaan dari Json Skema yang jarang digunakan tetapi juga dengan Json polos. Ini menyediakan Ant dan Maven plugin dan aplikasi tes online dapat memberi Anda gambaran tentang alat ini. Saya menaruh Json Tweet dan menghasilkan semua kelas yang berisi (Tweet, Pengguna, Lokasi, dll.).

Kami akan menggunakannya pada proyek Agorava untuk menghasilkan pemetaan Media Sosial dan mengikuti evolusi kontan dalam API mereka.

Antoine Sabot-Durand
sumber
Itu juga kesan saya, tetapi saya belum mencoba plugin Maven, namun versi onlinenya cukup lambat dan mati untuk apa pun selain kelas Person biasa ... Jadi untuk konversi online cepat, alat @ tim-boudreau berfungsi paling baik untuk saya.
Gregor
Saya mencoba JsonSchema2Pojo tetapi menekan tombol Preview muncul pratinjau kosong.
AndroidDev
5

Terima kasih semua yang berusaha membantu.
Bagi saya skrip ini sangat membantu. Ini hanya memproses JSON datar dan tidak mengurusi jenis, tetapi mengotomatisasi beberapa rutin

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

Saya sadar ini adalah pertanyaan lama, tetapi saya menemukan jawabannya ketika mencoba menemukan jawaban sendiri.

Jawaban yang menyebutkan generator json-pojo online (jsongen) bagus, tapi saya butuh sesuatu yang bisa saya jalankan di baris perintah dan lebih banyak tweak.

Jadi saya menulis skrip ruby ​​yang sangat pekat untuk mengambil sampel file JSON dan menghasilkan POJO dari itu. Ini memiliki sejumlah keterbatasan (misalnya, tidak berurusan dengan bidang yang cocok dengan kata kunci yang dilindungi undang-undang java) tetapi cukup untuk banyak kasus.

Kode yang dibuat, secara default, membuat catatan untuk digunakan dengan Jackson, tetapi ini dapat dimatikan dengan sakelar.

Anda dapat menemukan kode di github: https://github.com/wotifgroup/json2pojo

Chris R
sumber
2

Sejauh yang saya tahu tidak ada alat seperti itu. Namun.

Alasan utamanya adalah, saya curiga, bahwa tidak seperti dengan XML (yang memiliki XML Schema, dan kemudian alat-alat seperti 'xjc' untuk melakukan apa yang Anda minta, antara definisi XML dan POJO), tidak ada fitur bahasa skema lengkap. Ada JSON Schema, tetapi memiliki sedikit dukungan untuk definisi tipe aktual (berfokus pada struktur JSON), sehingga akan sulit untuk menghasilkan kelas Java. Tapi mungkin masih mungkin, esp. jika beberapa konvensi penamaan didefinisikan dan digunakan untuk mendukung generasi.

Namun: ini adalah sesuatu yang telah cukup sering diminta (pada milis proyek alat JSON yang saya ikuti), jadi saya pikir seseorang akan menulis alat semacam itu dalam waktu dekat.

Jadi saya tidak berpikir itu adalah ide yang buruk per se (juga: itu bukan ide yang baik untuk semua kasus penggunaan, tergantung pada apa yang ingin Anda lakukan).

StaxMan
sumber
2

Saya memiliki masalah yang sama sehingga saya memutuskan untuk mulai menulis alat kecil untuk membantu saya dengan ini. Saya akan berbagi dan membuka sumbernya.

https://github.com/BrunoAlexandreMendesMartins/CleverModels

Ini mendukung, JAVA, C # & Objective-c dari JSON.

Silakan berkontribusi!

Ehanoc
sumber
2

Anda juga dapat mencoba perpustakaan GSON. Yang cukup kuat itu dapat membuat JSON dari koleksi, objek dan karya kustom juga sebaliknya. Ini dirilis di bawah Apache License 2.0 sehingga Anda dapat menggunakannya juga secara komersial.

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

MB.One
sumber
13
tidak membuat definisi java
necromancer
3
Ini bukan pertanyaannya
hop
0

Untuk menambahkan ke pos @ japher. Jika Anda tidak terikat dengan JSON, Protokol Buffer layak untuk dicoba.

Dgorissen
sumber
1
Protokol Buffer bahkan tidak dekat dengan jawaban tentang cara membuat objek Java dari JSON. Paling tidak Anda seharusnya merekomendasikan alat untuk membuat Java Objects dari Protokol Buffer.
james.garriss
0

Coba solusi saya

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
}

Hasil Kelas Java

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

Dapatkan JSONObject

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

Masukkan JSONObject

obj.put("auctionHouse",auctionHouse);
obj.put("bidDate",bidDate);
obj.put("bidPrice",bidPrice);
obj.put("bidPrice1",bidPrice1);
obj.put("isYear",isYear);
Foobnix
sumber
jawaban ini terlihat sangat sepele. Ada cara otomatis untuk menghasilkan pojo dari json
Rafael Ruiz Tabares
0

Biarkan saya menunjukkan kepada Anda bagaimana untuk mengembangkan alat ini. Anda dapat melakukannya:

  1. fungsi pengguna javascript Json.parse (), membuat string seperti-json trans ke objek js
  2. kemudian gunakan objek ini untuk membuat format javabean.
  3. sesuatu, Anda harus peduli. (1) pemetaan tipe nilai, misalnya, cara mengetahui string, adalah tipe tanggal. (2) loweser_case ke camelCase

Saya dev alat memecahkan masalah. Itu desain yang baik dan lebih cepat. dapatkan kode dari github saya .

selamat menikmati dari sini, saya telah menyebarkannya di server web .

Saya mencoba saran atas 2 jawaban. Satu web tidak dapat membuka. Satu lebih lambat dari alat saya. Harap Anda akan menikmati alat saya.

lizeyang
sumber
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
Achrome