สร้างคลาส Java จาก JSON หรือไม่


216

ในโครงการ Java Maven คุณจะสร้างไฟล์ต้นฉบับ java จาก JSON ได้อย่างไร ตัวอย่างเช่นเรามี

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

เมื่อเรารันmvn generate-sourcesเราต้องการให้มันสร้างสิ่งนี้:

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

ในฐานะนักพัฒนา Java ฉันจำเป็นต้องเขียนบรรทัด XML ใดpom.xmlเพื่อให้สิ่งนี้เกิดขึ้น


ฉันได้อัปเดตคำถามและคำตอบเพื่อให้อยู่ในหัวข้อ กรุณาเปิดใหม่
Alex R

คำตอบ:


270

ลองใช้ปลั๊กอิน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>

<sourceType>json</sourceType>ครอบคลุมกรณีที่แหล่งที่มาเป็น JSON (เช่นสหกรณ์) หากคุณมีสกีมา json จริงให้ลบบรรทัดนี้

อัปเดตในปี 2020 มีสองสิ่งที่เกิดขึ้นตั้งแต่เดือนธันวาคมปี 2009 เมื่อมีการถามคำถามนี้:

  • ข้อมูลจำเพาะ JSON Schemaได้ย้ายที่มาก มันยังอยู่ในร่าง (ยังไม่สิ้นสุด) แต่ใกล้เสร็จแล้วและขณะนี้เป็นเครื่องมือที่ใช้งานได้ซึ่งระบุกฎโครงสร้างของคุณ

  • ผมได้เริ่มต้นเมื่อเร็ว ๆ นี้โครงการที่มาเปิดใหม่ที่ตั้งใจโดยเฉพาะการแก้ปัญหาของคุณ: jsonschema2pojo เครื่องมือ jsonschema2pojo ใช้เอกสาร json schema และสร้างคลาส Java DTO (ในรูปแบบของไฟล์ต้นฉบับ. java) โครงการยังไม่เป็นผู้ใหญ่ แต่ให้ความคุ้มครองในส่วนที่มีประโยชน์ที่สุดของ json schema ฉันกำลังมองหาข้อเสนอแนะเพิ่มเติมจากผู้ใช้เพื่อช่วยผลักดันการพัฒนา ตอนนี้คุณสามารถใช้เครื่องมือจากบรรทัดคำสั่งหรือเป็นปลั๊กอิน Maven

หวังว่านี่จะช่วยได้!


4
คนที่ใช้เครื่องมือ jsonschema2pojo ของคุณจะไม่ต้องเขียนไฟล์สคีมาของตัวเองเหรอ? OP ขอให้เริ่มด้วยไฟล์ Json ไม่ใช่สคีมา มีเครื่องมือสหายที่จะไปจาก Json -> Schema? ฉันคิดว่าเครื่องมือดังกล่าวหากมีอยู่เท่านั้นที่สามารถคาดเดาได้
Jeff Axelrod

3
ในฐานะของเวอร์ชัน 0.3.3 คุณสามารถใช้ JSON เก่าแบบธรรมดาเป็นอินพุท :)
joelittlejohn

14
... และตอนนี้ก็มีเครื่องสร้างออนไลน์ด้วยเช่นกัน: jsonschema2pojo.org
joelittlejohn

2
เครื่องมือที่ยอดเยี่ยม ลิงค์ที่ให้มามีเครื่องมือออนไลน์ที่คุณสามารถวางในตัวอย่าง JSON คลิกที่ปุ่มและรับแหล่ง Java
mbmast

1
@testerjoe หากคุณหมายถึงซอร์สโค้ด Java แล้วใช่ jsonschema2pojo ทำเช่นนี้และมันมีให้ใช้งานเช่นปลั๊กอิน maven, งาน ant, ส่วนขยาย gradle, เครื่องมือ CLI, ไลบรารี Java ฯลฯ ...
joelittlejohn

21

หากคุณกำลังใช้แจ็คสัน (ห้องสมุดยอดนิยมที่นั่น) ให้ลอง

https://github.com/astav/JsonToJava

โอเพนซอร์สและทุกคนควรมีส่วนร่วม

สรุป

ตัวสร้างคลาสซอร์สไฟล์ JsonToJava ที่อนุมาน schema ตามข้อมูล json ตัวอย่างที่ให้มาและสร้างโครงสร้างข้อมูล java ที่จำเป็น

มันส่งเสริมให้ทีมคิดใน Json ก่อนก่อนที่จะเขียนรหัสจริง

คุณสมบัติ

  • สามารถสร้างคลาสสำหรับลำดับชั้นที่ซับซ้อนตามอำเภอใจ (แบบเรียกซ้ำ)
  • สามารถอ่านคลาส Java ที่มีอยู่ของคุณและหากสามารถดีซีเรียลไลซ์ลงในโครงสร้างเหล่านั้นจะทำได้
  • จะแจ้งให้ผู้ใช้ป้อนเมื่อมีกรณีที่ไม่ชัดเจน

13

นี่คือเครื่องมือออนไลน์ที่จะใช้ JSON รวมถึงออบเจกต์ที่ซ้อนกันหรืออาร์เรย์ของออบเจกต์ที่ซ้อนกันและสร้างแหล่ง Java ที่มีการเพิ่มความคิดเห็นของแจ็คสัน


1
มันใช้ได้ดีมากสำหรับฉันในครั้งแรก ฉันใช้ JSON ซ้อนกันและทำงานได้ดีแม้ว่าฉันจะต้องตัดส่วนที่ซ้ำซ้อนเพื่อให้ได้ขนาดโดยรวมที่ต่ำกว่า 2k เปิดใช้งานให้ฉันเขียน: MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (someURLthatReturnsJSON), MyClass.class) และข้อมูลผลลัพธ์ที่ได้ไหลอย่างสมบูรณ์แบบ ฉันต้องลบเครื่องหมาย Jackson ทั้งหมด แต่อย่างอื่นมันใช้งานได้ดีกับ gson ขอบคุณ.
noogrub

ขอบคุณมันใช้งานได้ เมื่อฉันป้อน JSON ด้วยฟิลด์ตามตัวพิมพ์เล็กและใหญ่ไซต์นี้แสดงผลลัพธ์ในขณะที่ www.jsonschema2pojo.org รายงานข้อผิดพลาด
CoolMind

6

ตอบคำถามเก่านี้กับโครงการล่าสุด ;-)

ในขณะนี้ทางออกที่ดีที่สุดน่าจะเป็นJsonSchema2Pojo :

มันทำงานได้ไม่บ่อยนักจาก Json Schema แต่ใช้กับ Json ธรรมดา มันมีปลั๊กอิน Ant และ Maven และแอปพลิเคชันทดสอบออนไลน์สามารถให้แนวคิดเกี่ยวกับเครื่องมือ ฉันใส่ทวีต Json และสร้างคลาสที่มีทั้งหมด (ทวีตผู้ใช้ที่ตั้ง ฯลฯ .. )

เราจะใช้มันในโครงการAgoravaเพื่อสร้างการแมปโซเชียลมีเดียและติดตามวิวัฒนาการใน API ของพวกเขา


นั่นเป็นความประทับใจของฉันด้วย แต่ฉันยังไม่ได้ลองใช้ Maven plugin แต่รุ่นออนไลน์ค่อนข้างช้าและตายเพื่อสิ่งอื่นนอกเหนือจากคลาสบุคคลทั่วไป ... ดังนั้นสำหรับการแปลงออนไลน์อย่างรวดเร็วเครื่องมือของ @ tim-boudreau ทำงานได้ดีที่สุดสำหรับ ผม.
Gregor

ฉันลอง JsonSchema2Pojo แต่กดปุ่ม Preview จะปรากฏตัวอย่างว่างเปล่าขึ้นมา
AndroidDev

5

ขอบคุณทุกคนที่พยายามช่วย
สำหรับฉันสคริปต์นี้มีประโยชน์ มันประมวลผลเพียงแบน JSON และไม่ดูแลประเภท แต่ทำกิจวัตรประจำวันโดยอัตโนมัติ

  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

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันก็สะดุดในขณะที่พยายามหาคำตอบด้วยตนเอง

คำตอบที่กล่าวถึงตัวสร้าง json-pojo ออนไลน์ (jsongen) นั้นดี แต่ฉันต้องการบางสิ่งที่ฉันสามารถเรียกใช้บนบรรทัดคำสั่งและปรับแต่งเพิ่มเติม

ดังนั้นฉันจึงเขียนสคริปต์ ruby ​​ที่แฮ็คมากเพื่อรับไฟล์ JSON ตัวอย่างและสร้าง POJO จากมัน มันมีข้อ จำกัด จำนวนมาก (ตัวอย่างเช่นมันไม่ได้จัดการกับเขตข้อมูลที่ตรงกับคำหลักที่สงวนไว้ของ Java) แต่ก็เพียงพอสำหรับหลายกรณี

รหัสที่สร้างโดยค่าเริ่มต้นจะมีคำอธิบายประกอบสำหรับใช้กับ Jackson แต่สามารถปิดได้ด้วยสวิตช์

คุณสามารถค้นหารหัสได้ที่ github: https://github.com/wotifgroup/json2pojo


2

เท่าที่ฉันรู้ไม่มีเครื่องมือดังกล่าว ยัง.

เหตุผลหลักคือฉันสงสัยว่าแตกต่างจาก XML (ซึ่งมี XML Schema แล้วเครื่องมือเช่น 'xjc' เพื่อทำสิ่งที่คุณถามระหว่าง XML และ POJO คำจำกัดความ) ไม่มีภาษาสคีคุณสมบัติอย่างเต็มที่ มี JSON Schema แต่มีการสนับสนุนน้อยมากสำหรับคำจำกัดความประเภทจริง (เน้นโครงสร้าง JSON) ดังนั้นมันจึงเป็นเรื่องยากที่จะสร้างคลาส Java แต่อาจเป็นไปได้โดยเฉพาะอย่างยิ่ง หากมีการนิยามการตั้งชื่อบางรายการและใช้เพื่อสนับสนุนการสร้าง

อย่างไรก็ตาม: นี่เป็นสิ่งที่ได้รับการร้องขอบ่อยครั้ง (ในรายชื่อผู้รับจดหมายของโครงการเครื่องมือ JSON ที่ฉันติดตาม) ดังนั้นฉันคิดว่าบางคนจะเขียนเครื่องมือดังกล่าวในอนาคตอันใกล้

ดังนั้นฉันไม่คิดว่ามันเป็นความคิดที่ไม่ดีต่อ se (เช่น: มันไม่ใช่ความคิดที่ดีสำหรับทุกกรณีการใช้งานขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ)


2

ฉันมีปัญหาเดียวกันดังนั้นฉันตัดสินใจที่จะเริ่มเขียนเครื่องมือขนาดเล็กเพื่อช่วยฉันในเรื่องนี้ ฉันจะแบ่งปันและเปิดแหล่งที่มา

https://github.com/BrunoAlexandreMendesMartins/CleverModels

รองรับ JAVA, C # & Objective-c จาก JSON

รู้สึกอิสระที่จะมีส่วนร่วม!


2

คุณสามารถลองใช้ห้องสมุด GSON มันค่อนข้างมีประสิทธิภาพมันสามารถสร้าง JSON ได้จากคอลเลกชันวัตถุที่กำหนดเองและผลงานในทางกลับกัน มันวางจำหน่ายภายใต้ Apache License 2.0 เพื่อให้คุณสามารถใช้งานได้ในเชิงพาณิชย์

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


13
ไม่ได้สร้างคำจำกัดความของจาวา
หมอผี

3
นี่ไม่ใช่คำถามที่ถาม
hop

1

ฉันสร้างโครงการ Github Json2Java ที่ทำสิ่งนี้ https://github.com/inder123/json2java

Json2Java จัดเตรียมการกำหนดเองเช่นการเปลี่ยนชื่อฟิลด์และการสร้างลำดับชั้นการสืบทอด

ฉันใช้เครื่องมือเพื่อสร้าง API ที่ค่อนข้างซับซ้อน:

API TMS ของ Gracenote: https://github.com/inder123/gracenote-java-api

Google Maps Geocoding API: https://github.com/inder123/geocoding


0

หากต้องการเพิ่มในโพสต์ของ @ japher หากคุณไม่ได้เชื่อมโยงกับ JSON โดยเฉพาะProtocol Buffersก็คุ้มค่าที่จะเช็คเอาท์


1
Protocol Buffers ไม่ได้ใกล้เคียงกับคำตอบเกี่ยวกับวิธีสร้างวัตถุ Java จาก JSON อย่างน้อยที่สุดคุณควรแนะนำเครื่องมือในการสร้าง Java Objects จาก Protocol Buffers
james.garriss

0

ลองวิธีแก้ปัญหาของฉัน

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
}

คลาส Java ผลลัพธ์

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

JSONObject รับ

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

JSONObject ใส่

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

คำตอบนี้ดูเล็กน้อย มีวิธีอัตโนมัติในการสร้าง pojo จาก json
Rafael Ruiz Tabares

0

ให้ฉันแสดงวิธีการพัฒนาเครื่องมือคุณสามารถทำได้:

  1. ฟังก์ชั่นผู้ใช้ javascript Json.parse () ทำให้สตริง like-json เปลี่ยนเป็นวัตถุ js
  2. จากนั้นใช้วัตถุนี้เพื่อสร้างรูปแบบ javabean
  3. บางสิ่งบางอย่าง, คุณ shoud care (1) การจับคู่ประเภทค่า, forexample, วิธีการคำนวณสตริง, เป็นประเภทวันที่ (2) loweser_case to camelCase

ฉัน dev เครื่องมือแก้ปัญหามันออกแบบมาอย่างดีและรวดเร็วขึ้น ได้รับรหัสจากฉันGitHub

สนุกกับมันจากที่นี่ผมมีปรับใช้บนเว็บเซิร์ฟเวอร์

ฉันลองตอบข้อเสนอแนะ 2 ข้อแรกของเว็บเดียวไม่สามารถเปิดได้หนึ่งช้ากว่าเครื่องมือของฉันคุณจะสนุกกับเครื่องมือของฉัน


ในขณะที่ลิงค์นี้อาจตอบคำถามได้ดีกว่าที่จะรวมส่วนที่สำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง คำตอบสำหรับลิงก์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง
Achrome
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.