簡體   English   中英

從 JSON 生成 Java 類?

[英]Generate Java class from JSON?

在Java Maven項目中,如何從JSON生成java源文件? 例如我們有

{
  "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 開發人員,我需要在pom.xml中編寫哪些 XML 行才能實現這一點?

試試http://www.jsonschema2pojo.org

或者 Maven 的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(如 OP)的情況。 如果您有實際的 json模式,請刪除此行。

2014 年更新:自 09 年 12 月提出此問題以來,發生了兩件事:

  • JSON Schema 規范發生了很大變化。 它仍在草案中(未最終確定)但已接近完成,現在是一個可行的工具,可指定您的結構規則

  • 我最近啟動了一個新的開源項目,專門用於解決您的問題: jsonschema2pojo jsonschema2pojo 工具采用 json 模式文檔並生成 DTO 樣式的 Java 類(以 .java 源文件的形式)。 該項目尚未成熟,但已經涵蓋了 json 模式最有用的部分。 我正在尋求用戶的更多反饋,以幫助推動開發。 現在您可以從命令行或作為 Maven 插件使用該工具。

希望這可以幫助!

如果您使用的是 Jackson(那里最受歡迎的圖書館),請嘗試

https://github.com/astav/JsonToJava

它是開源的(上次更新時間為 2013 年 6 月 7 日,截至 2020 年),任何人都應該能夠做出貢獻。

概括

一個 JsonToJava 源類文件生成器,它根據提供的示例 json 數據推導出模式並生成必要的 java 數據結構。

它鼓勵團隊在編寫實際代碼之前首先考慮 Json。

特征

  • 可以為任意復雜的層次結構生成類(遞歸)
  • 可以讀取您現有的 Java 類,如果它可以反序列化為這些結構,就會這樣做
  • 存在歧義時會提示用戶輸入

這是一個在線工具,它將采用 JSON,包括嵌套對象或嵌套對象數組,並生成帶有 Jackson 注釋的 Java 源代碼。

用最近的項目回答這個老問題;-)。

目前最好的解決方案可能是JsonSchema2Pojo

它完成了很少使用的 Json Schema 和普通 Json 的工作。 它提供了 Ant 和 Maven 插件,一個在線測試應用程序可以讓您了解該工具。 我放了一個 Json Tweet 並生成了所有包含類(Tweet、User、Location 等)。

我們將在Agorava項目中使用它來生成社交媒體映射並跟蹤其 API 中的持續演變。

感謝所有試圖提供幫助的人。
對我來說,這個腳本很有幫助。 它只處理平面 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("}");

我知道這是一個老問題,但我在試圖自己尋找答案時偶然發現了它。

提到在線 json-pojo 生成器 (jsongen) 的答案很好,但我需要一些可以在命令行上運行並進行更多調整的東西。

所以我寫了一個非常 hacky 的 ruby​​ 腳本來獲取一個示例 JSON 文件並從中生成 POJO。 它有許多限制(例如,它不處理與 java 保留關鍵字匹配的字段),但它在許多情況下已經足夠了。

默認情況下,生成的代碼注釋以供 Jackson 使用,但這可以通過開關關閉。

你可以在github上找到代碼: https : //github.com/wotifgroup/json2pojo

我遇到了同樣的問題,所以我決定開始編寫一個小工具來幫助我解決這個問題。 我要分享並開源它。

https://github.com/BrunoAlexandreMendesMartins/CleverModels

它支持 JSON 中的 JAVA、C# 和 Objective-c。

隨意貢獻!

您也可以嘗試 GSON 庫。 它非常強大,它可以從集合、自定義對象創建 JSON,反之亦然。 它是在 Apache License 2.0 下發布的,因此您也可以在商業上使用它。

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

我創建了一個 github 項目 Json2Java 來執行此操作。 https://github.com/inder123/json2java

Json2Java 提供了自定義,例如重命名字段和創建繼承層次結構。

我已經使用該工具創建了一些相對復雜的 API:

Gracenote 的 TMS API: https : //github.com/inder123/gracenote-java-api

谷歌地圖地理編碼 API: https : //github.com/inder123/geocoding

據我所知,沒有這樣的工具。 然而。

我懷疑,主要原因是,與 XML(它有 XML 模式,然后是像“xjc”這樣的工具來做你所要求的,在 XML 和 POJO 定義之間)不同,沒有完全特征的模式語言。 有 JSON Schema,但它對實際類型定義的支持很少(專注於 JSON 結構),因此生成 Java 類會很棘手。 但可能仍然有可能,尤其是。 如果定義了一些命名約定並用於支持生成。

但是:這是經常被要求的東西(在我關注的 JSON 工具項目的郵件列表中),所以我認為在不久的將來有人會編寫這樣的工具。

所以我不認為這本身是一個壞主意(另外:這對所有用例來說都不是一個好主意,取決於你想做什么)。

試試我的解決方案

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 類,而不是一些提到的網站所做的一個巨大的類:

https://json2csharp.com/json-to-pojo

它也有其他轉換器。 此外,它可以在線工作而不受大小限制。 我的 JSON 很大,而且運行良好。

讓我告訴你如何開發工具。你可以這樣做:

  1. 用戶javascript函數Json.parse(),使字符串像-json trans轉換為js對象
  2. 然后使用此對象生成javabean格式。
  3. 什么,你應該小心。(1)值類型映射,例如,如何找出字符串,是日期類型。(2)loweser_case to camelCase

我開發了一個解決問題的工具。設計好,速度快。 從我的github獲取代碼。

從這里享受它,我已經在網絡服務器上部署它。

我嘗試了前2個答案的建議。一個網絡無法打開。一個比我的工具慢。你會喜歡我的工具。

添加到@japher 的帖子。 如果您不是特別依賴 JSON, Protocol Buffers值得一試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM