Generate Java class from JSON?
我想要一个从JSON生成java源文件的实用程序。 比如我们有
1 2 3 4 5 6 7 8 | { "firstName":"John", "lastName":"Smith", "address": { "streetAddress":"21 2nd Street", "city":"New York" } } |
我们将它传递给实用程序,我们希望它生成这样的东西:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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")); } } |
写起来并不难,但我确信有人已经这样做了。
尝试:
http://www.jsonschema2pojo.org
Orsol,我相信你还没有在这里等待解决方案,但为了找到这个帖子的下一个人,我想我会添加更多信息。
自2009年12月问及此问题以来,发生了两件事情:
-
JSON Schema规范已经发生了很多变化。它仍在草案中(尚未最终确定),但它已接近完成,现在是一个可行的工具,用于指定您的结构规则
-
我最近开始了一个新的开源项目,专门用于解决您的问题:jsonschema2pojo。 jsonschema2pojo工具获取json模式文档并生成DTO样式的Java类(以.java源文件的形式)。该项目尚未成熟,但已经提供了对json模式最有用部分的报道。我正在寻求用户的更多反馈,以帮助推动开发。现在,您可以使用命令行中的工具或Maven插件。
希望这可以帮助!
如果您正在使用杰克逊(那里最受欢迎的图书馆),请尝试
https://github.com/astav/JsonToJava
它的开源和任何人都应该能够贡献。
摘要
JsonToJava源类文件生成器,它根据提供的示例json数据推断模式,并生成必要的Java数据结构。
在编写实际代码之前,它鼓励团队先在Json中思考。
特征
- 可以为任意复杂的层次结构生成类(递归)
- 可以读取您现有的Java类,如果它可以反序列化为这些结构,则会这样做
- 当存在模糊情况时,将提示用户输入
这是一个将采用JSON的在线工具,包括嵌套对象或嵌套的对象数组,并使用Jackson注释生成Java源代码。
用最近的项目回答这个老问题;-)。
目前最好的解决方案可能是JsonSchema2Pojo:
它很少使用Json Schema,也可以使用普通的Json。它提供了Ant和Maven插件,在线测试应用程序可以让您了解该工具。我放了一个Json Tweet并生成了所有包含的类(Tweet,User,Location等)。
我们将在Agorava项目中使用它来生成社交媒体映射,并跟踪其API中的不断演变。
我知道这是一个老问题,但我在试图找到答案时偶然发现了它。
提到在线json-pojo生成器(jsongen)的答案很好,但我需要一些我可以在命令行上运行并调整更多的东西。
所以我编写了一个非常hacky的ruby脚本来获取示例JSON文件并从中生成POJO。它有许多限制(例如,它不处理与java保留关键字匹配的字段),但它在很多情况下都足够了。
默认情况下,生成的代码注释用于Jackson,但可以通过开关关闭。
你可以在github上找到代码:https://github.com/wotifgroup/json2pojo
感谢所有试图提供帮助的人。
对我来说这个脚本很有帮助。它只处理平面JSON并且不处理类型,而是自动化一些例程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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("}"); |
您也可以尝试GSON库。它非常强大,它可以从集合,自定义对象和工作中创建JSON,反之亦然。它在Apache License 2.0下发布,因此您也可以在商业上使用它。
http://code.google.com/p/google-gson/
我遇到了同样的问题,所以我决定开始编写一个小工具来帮助我。我要分享并开源。
https://github.com/BrunoAlexandreMendesMartins/CleverModels
它支持来自JSON的JAVA,C#和Objective-c。
随意贡献!
据我所知,没有这样的工具。然而。
主要原因是,我怀疑,与XML(具有XML Schema,然后像'xjc'这样的工具来执行您所要求的,XML和POJO定义之间的工具)不同,没有完全特征的模式语言。有JSON Schema,但它几乎不支持实际的类型定义(专注于JSON结构),因此生成Java类会很棘手。但可能仍有可能,尤其是如果定义了一些命名约定并用于支持生成。
但是:这是经常被请求的东西(在我关注的JSON工具项目的邮件列表上),所以我认为有人会在不久的将来编写这样的工具。
所以我认为这本身并不是一个坏主意(同样:对所有用例来说,这不是一个好主意,取决于你想做什么)。
我创建了一个github项目Json2Java来做到这一点。
https://github.com/inder123/json2java
Json2Java提供自定义,例如重命名字段和创建继承层次结构。
我使用该工具创建了一些相对复杂的API:
Gracenote的TMS API:https://github.com/inder123/gracenote-java-api
Google Maps Geocoding API:https://github.com/inder123/geocoding
让我告诉你如何开发工具。你可以这样做:
我开发了一个解决问题的工具。设计好,速度快。
从我的github获取代码。
从这里享受它,我已经在网络服务器上部署它。
我尝试了前2个答案的建议。一个网络无法打开。一个比我的工具慢。你会喜欢我的工具。
试试我的解决方案
http://htmlpreview.github.io/?https://raw.githubusercontent.com/foobnix/android-universal-utils/master/json/generator.html
1 2 3 4 5 6 7 | { "auctionHouse":"sample string 1", "bidDate":"2014-05-30T08:20:38.5426521-04:00", "bidPrice": 3, "bidPrice1": 3.1, "isYear":true } |
结果Java类
1 2 3 4 5 |
JSONObject得到
1 2 3 4 5 | auctionHouse = obj.getString("auctionHouse"); bidDate = obj.opt("bidDate"); bidPrice = obj.getInt("bidPrice"); bidPrice1 = obj.getDouble("bidPrice1"); isYear = obj.getBoolean("isYear"); |
JSONObject放
1 2 3 4 5 | obj.put("auctionHouse",auctionHouse); obj.put("bidDate",bidDate); obj.put("bidPrice",bidPrice); obj.put("bidPrice1",bidPrice1); obj.put("isYear",isYear); |
添加到@ japher的帖子。如果您没有特别依赖JSON,则协议缓冲区值得一试。