Tạo lớp Java từ JSON?


215

Trong dự án Java Maven, làm thế nào để bạn tạo các tệp nguồn java từ JSON? Ví dụ chúng ta có

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

Khi chúng tôi chạy, mvn generate-sourceschúng tôi muốn nó tạo ra một cái gì đó như thế này:

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

Là một nhà phát triển Java, tôi cần viết những dòng XML nào pom.xmlđể thực hiện điều này?


Tôi đã cập nhật câu hỏi và câu trả lời để đưa chúng vào chủ đề. Vui lòng mở lại.
Alex R

Câu trả lời:


269

Hãy dùng thử trình cắm 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>

Các <sourceType>json</sourceType>trường hợp bao gồm các nguồn là json (như OP). Nếu bạn có lược đồ json thực tế , loại bỏ dòng này.

Cập nhật vào năm 2020. Hai điều đã xảy ra kể từ tháng 12 năm 2009 khi câu hỏi này được hỏi:

  • Thông số JSON Schema đã di chuyển rất nhiều. Nó vẫn còn trong dự thảo (chưa hoàn thành) nhưng sắp hoàn thành và hiện là công cụ hữu hiệu chỉ định quy tắc cấu trúc của bạn

  • Gần đây tôi đã bắt đầu một dự án nguồn mở mới nhằm giải quyết vấn đề của bạn: jsonschema2pojo . Công cụ jsonschema2pojo lấy một tài liệu lược đồ json và tạo các lớp Java kiểu DTO (dưới dạng các tệp nguồn .java). Dự án chưa hoàn thiện nhưng đã cung cấp vùng phủ sóng của các phần hữu ích nhất của lược đồ json. Tôi đang tìm kiếm thêm thông tin phản hồi từ người dùng để giúp thúc đẩy sự phát triển. Ngay bây giờ bạn có thể sử dụng công cụ từ dòng lệnh hoặc làm plugin Maven.

Hi vọng điêu nay co ich!


4
Không phải ai đó đã sử dụng công cụ jsonschema2pojo của bạn thì phải viết tệp lược đồ của riêng họ chứ? OP yêu cầu bắt đầu với tệp Json, không phải lược đồ. Có một công cụ đồng hành để đi từ Json -> Schema không? Tôi cho rằng một công cụ như vậy, nếu nó tồn tại, chỉ có thể đưa ra dự đoán.
Jeff Axelrod

3
Kể từ phiên bản 0.3.3, bạn có thể sử dụng JSON cũ đơn giản làm đầu vào :)
joelittlejohn

14
... và giờ đây cũng có một trình tạo trực tuyến: jsonschema2pojo.org
joelittlejohn

2
Công cụ tuyệt vời. Liên kết được cung cấp chứa một công cụ trực tuyến nơi bạn có thể dán vào JSON mẫu, nhấp vào nút và nhận nguồn Java.
mbmast

1
@testerjoe Nếu bạn có nghĩa là mã nguồn Java, sau đó có jsonschema2pojo thực hiện điều này, và nó có sẵn như là một maven plugin, nhiệm vụ kiến, mở rộng gradle, công cụ CLI, thư viện java, vv ...
joelittlejohn

21

Nếu bạn đang sử dụng Jackson (thư viện phổ biến nhất ở đó), hãy thử

https://github.com/astav/JsonToJava

Nguồn mở của nó và bất cứ ai cũng có thể đóng góp.

Tóm lược

Trình tạo tệp lớp nguồn JsonToJava suy ra lược đồ dựa trên dữ liệu json mẫu được cung cấp và tạo các cấu trúc dữ liệu java cần thiết.

Nó khuyến khích các đội nghĩ về Json trước, trước khi viết mã thực tế.

Đặc trưng

  • Có thể tạo các lớp cho một hệ thống phân cấp phức tạp tùy ý (đệ quy)
  • Có thể đọc các lớp Java hiện có của bạn và nếu nó có thể giải tuần tự hóa các cấu trúc đó, sẽ làm như vậy
  • Sẽ nhắc nhập dữ liệu người dùng khi có trường hợp mơ hồ

13

Đây là một công cụ trực tuyến sẽ lấy JSON, bao gồm các đối tượng lồng nhau hoặc các mảng đối tượng lồng nhau và tạo nguồn Java với các chú thích Jackson.


1
Điều này làm việc rất tốt cho tôi trong lần đầu tiên. Tôi đã lồng JSON sâu và nó hoạt động tốt, mặc dù tôi đã phải cắt bớt các phần dư thừa để có kích thước tổng thể dưới 2k. Cho phép tôi viết: MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (someURLthatReturnsJSON), MyClass. class); và dữ liệu kết quả chảy hoàn hảo. Tôi đã phải loại bỏ tất cả các ký hiệu Jackson, nhưng nếu không thì nó hoạt động tốt cho gson. Cảm ơn bạn.
noogrub

Cảm ơn, nó hoạt động. Khi tôi cung cấp JSON với các trường phân biệt chữ hoa chữ thường, trang web này đã trả về kết quả, trong khi www.jsonschema2pojo.org báo cáo lỗi.
CoolMind

6

Trả lời câu hỏi cũ này với dự án gần đây ;-).

Hiện tại, giải pháp tốt nhất có lẽ là JsonSchema2Pojo :

Nó thực hiện công việc từ hiếm khi sử dụng Json Schema nhưng cũng với Json đơn giản. Nó cung cấp plugin Ant và Maven và một ứng dụng thử nghiệm trực tuyến có thể cho bạn ý tưởng về công cụ này. Tôi đặt Tweet Json và tạo tất cả các lớp có chứa (Tweet, Người dùng, Vị trí, v.v.).

Chúng tôi sẽ sử dụng nó trong dự án Agorava để tạo ánh xạ Social Media và theo dõi quá trình phát triển tiếp theo trong API của họ.


Đó cũng là ấn tượng của tôi, nhưng tôi chưa thử plugin Maven, tuy nhiên phiên bản trực tuyến khá chậm và chết vì bất kỳ thứ gì khác ngoài lớp Người thông thường ... Vì vậy, để chuyển đổi trực tuyến nhanh chóng, công cụ của @ tim-boudreau hoạt động tốt nhất cho tôi.
Gregor

Tôi đã thử JsonSchema2Pojo nhưng nhấn nút Preview sẽ bật lên phần xem trước trống.
AndroidDev

5

Cảm ơn tất cả những người đã cố gắng giúp đỡ.
Đối với tôi kịch bản này là hữu ích. Nó chỉ xử lý JSON phẳng và không quan tâm đến các loại, nhưng tự động hóa một số thói quen

  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

Tôi biết đây là một câu hỏi cũ, nhưng tôi tình cờ thấy nó trong khi cố gắng tự tìm câu trả lời.

Câu trả lời đề cập đến trình tạo json-pojo trực tuyến (jsongen) là tốt, nhưng tôi cần một cái gì đó tôi có thể chạy trên dòng lệnh và điều chỉnh nhiều hơn.

Vì vậy, tôi đã viết một tập lệnh ruby ​​rất hacky để lấy một tệp JSON mẫu và tạo POJO từ nó. Nó có một số hạn chế (ví dụ: nó không xử lý các trường khớp với các từ khóa dành riêng java) nhưng nó đủ cho nhiều trường hợp.

Mã được tạo, theo mặc định, chú thích để sử dụng với Jackson, nhưng điều này có thể được tắt bằng một công tắc.

Bạn có thể tìm mã trên github: https://github.com/wotifgroup/json2pojo


2

Theo tôi biết không có công cụ như vậy. Chưa.

Lý do chính là, tôi nghi ngờ rằng, không giống như XML (có Lược đồ XML và sau đó là các công cụ như 'xjc' để làm những gì bạn yêu cầu, giữa các định nghĩa XML và POJO), không có ngôn ngữ lược đồ đầy đủ. Có Lược đồ JSON, nhưng nó có rất ít hỗ trợ cho các định nghĩa kiểu thực tế (tập trung vào các cấu trúc JSON), do đó sẽ rất khó để tạo các lớp Java. Nhưng có lẽ vẫn có thể, đặc biệt. nếu một số quy ước đặt tên được xác định và sử dụng để hỗ trợ tạo.

Tuy nhiên: đây là điều được yêu cầu khá thường xuyên (trên danh sách gửi thư của các dự án công cụ JSON mà tôi theo dõi), vì vậy tôi nghĩ rằng ai đó sẽ viết một công cụ như vậy trong tương lai gần.

Vì vậy, tôi không nghĩ rằng đó là một ý tưởng tồi cho mỗi người (cũng: đó không phải là một ý tưởng tốt cho tất cả các trường hợp sử dụng, phụ thuộc vào những gì bạn muốn làm).



2

Bạn cũng có thể thử thư viện GSON. Nó khá mạnh mẽ, nó có thể tạo JSON từ các bộ sưu tập, các đối tượng tùy chỉnh và hoạt động ngược lại. Nó được phát hành theo Giấy phép Apache 2.0 để bạn có thể sử dụng nó một cách thương mại.

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


13
không tạo định nghĩa java
necromancer

3
Đây không phải là những gì câu hỏi về
hop


0

Để thêm vào bài viết của @ japher. Nếu bạn không đặc biệt gắn với JSON, Bộ đệm giao thức đáng để kiểm tra.


1
Bộ đệm giao thức thậm chí không gần với câu trả lời về cách tạo các đối tượng Java từ JSON. Ít nhất bạn nên có một công cụ để tạo các Đối tượng Java từ Bộ đệm giao thức.
james.garriss

0

Hãy thử giải pháp của tôi

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
}

Lớp Java kết quả

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

JSONObject nhận

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

JSONObject đặt

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

Câu trả lời này có vẻ tầm thường. Có cách tự động để tạo pojo từ json
Rafael Ruiz Tabares

0

Hãy để tôi chỉ cho bạn cách phát triển công cụ. Bạn có thể làm như vậy:

  1. Hàm javascript của người dùng Json.parse (), tạo chuỗi like-json trans thành đối tượng js
  2. sau đó sử dụng đối tượng này để di chuyển định dạng javabean.
  3. một cái gì đó bạn quan tâm. (1) ánh xạ loại giá trị, ví dụ, cách tìm ra chuỗi, là loại ngày. (2) loweser_case thành camelCase

Tôi phát triển một công cụ giải quyết vấn đề. Nó được thiết kế tốt và nhanh chóng hơn. lấy mã từ github của tôi .

Hãy tận hưởng nó từ đây, tôi đã triển khai nó trên máy chủ web .

Tôi thử gợi ý của 2 câu trả lời hàng đầu. Một trang web không thể mở. Làm chậm hơn công cụ của tôi. Hy vọng bạn sẽ thích công cụ của tôi.


Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
Achrom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.