[英]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。
特征
這是一個在線工具,它將采用 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 下發布的,因此您也可以在商業上使用它。
我創建了一個 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 工具項目的郵件列表中),所以我認為在不久的將來有人會編寫這樣的工具。
所以我不認為這本身是一個壞主意(另外:這對所有用例來說都不是一個好主意,取決於你想做什么)。
試試我的解決方案
{
"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 很大,而且運行良好。
添加到@japher 的帖子。 如果您不是特別依賴 JSON, Protocol Buffers值得一試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.