从JSON生成Java类?

在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行才能实现这一点?

371268 次浏览

谢谢所有想帮忙的人。对我来说这个脚本很有帮助。它只处理普通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("}");

据我所知,没有这样的工具。然而。

我怀疑,主要原因是,不像XML(它有XML Schema,然后像“xjc”这样的工具可以在XML和POJO定义之间做你想做的事情),没有完全特性的模式语言。有JSON Schema,但是它很少支持实际的类型定义(主要关注JSON结构),所以生成Java类会很棘手。但是可能仍然是可能的,特别是如果定义并使用一些命名约定来支持生成的话。

然而,这是一些相当频繁的要求(在我所关注的JSON工具项目的邮件列表中),所以我认为在不久的将来会有人编写这样的工具。

所以我不认为它本身是一个坏主意(而且:它对所有用例都不是一个好主意,这取决于你想做什么)。

尝试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年更新:自2009年12月提出这个问题以来,发生了两件事:

  • JSON模式规范已经移动了很多。它仍处于草案阶段(尚未最终确定),但已接近完成,现在已成为指定结构规则的可行工具

  • 我最近开始了一个新的开源项目,专门用来解决你的问题:jsonschema2pojo。jsonschema2pojo工具使用json模式文档并生成dto风格的Java类(以. Java源文件的形式)。该项目还不成熟,但已经涵盖了json模式中最有用的部分。我正在从用户那里寻求更多的反馈,以帮助推动开发。现在,您可以从命令行或作为Maven插件使用该工具。

希望这能有所帮助!

添加到@japher的帖子。如果你不是特别绑定JSON, 协议缓冲区值得一试。

我知道这是一个老问题,但我是在自己试图寻找答案的时候偶然发现的。

答案中提到了在线json-pojo生成器(jsongen),这很好,但我需要一些可以在命令行上运行并进行更多调整的东西。

因此,我编写了一个非常粗糙的ruby脚本来获取一个示例JSON文件并从中生成pojo。它有许多限制(例如,它不处理与java保留关键字匹配的字段),但在许多情况下它已经足够了。

默认情况下,生成的代码对Jackson进行注释,但可以通过开关关闭。

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

我也有同样的问题,所以我决定开始写一个小工具来帮助我解决这个问题。我要分享并开源它。

https://github.com/BrunoAlexandreMendesMartins/CleverModels

它支持,JAVA, c# &Objective-c来自JSON。

欢迎投稿!

用最近的项目回答这个老问题;-)。

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

它从很少使用的Json Schema中完成这项工作,但也可以使用纯Json。它提供了Ant和Maven插件,在线测试申请可以让你对这个工具有一个概念。我放了一个Json Tweet,并生成了所有包含类(Tweet,用户,位置等)。

我们将在Agorava项目中使用它来生成社交媒体映射,并在它们的API中遵循恒定的演化。

你也可以试试GSON库。它非常强大,它可以从集合,自定义对象和作品中创建JSON,反之亦然。它是在Apache许可证2.0下发布的,所以你也可以在商业上使用它。

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

如果你正在使用Jackson(那里最受欢迎的库),试试吧

https://github.com/astav/JsonToJava

它是开源的(最后更新于2013年6月7日至2021年),任何人都可以贡献。

总结

JsonToJava源类文件生成器,它根据提供的示例json数据推导模式并生成必要的java数据结构。

它鼓励团队在编写实际代码之前先用Json思考。

特性

  • 可以为任意复杂的层次结构生成类(递归地)
  • 是否可以读取现有的Java类,如果可以反序列化为这些结构,是否会这样做
  • 当存在模棱两可的情况时,是否会提示用户输入

试试我的解决方案

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

这里是一个在线工具,它将接受JSON,包括嵌套对象或嵌套对象数组,并生成带有Jackson注释的Java源代码。

我创建了一个github项目Json2Java,它可以做到这一点。 https://github.com/inder123/json2java < / p >

Json2Java提供了重命名字段和创建继承层次结构等定制。

我用这个工具创建了一些相对复杂的api:

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

谷歌地图地理编码API: https://github.com/inder123/geocoding

我知道有很多答案,但在所有这些答案中,我发现这一个对我最有用。下面的链接将所有POJO类放在一个单独的文件中,而不是像一些提到的网站那样放在一个巨大的类中:

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

它还有其他转换器。此外,它可以在线工作,不受大小限制。我的JSON是巨大的,它工作得很好。