从 JSON 生成 Java 类?
Posted
技术标签:
【中文标题】从 JSON 生成 Java 类?【英文标题】:Generate Java class from JSON? 【发布时间】:2010-12-29 18:26:18 【问题描述】:在 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 行才能实现这一点?
【问题讨论】:
我已经更新了问题和答案,使它们成为主题。请重新打开。 【参考方案1】:如果您使用的是 Jackson(那里最受欢迎的库),请尝试
https://github.com/astav/JsonToJava
它是开源的(截至 2021 年最后一次更新是 2013 年 6 月 7 日),任何人都应该能够做出贡献。
总结
一个 JsonToJava 源类文件生成器,它根据提供的示例 json 数据推断架构并生成必要的 java 数据结构。
它鼓励团队在编写实际代码之前先考虑 Json。
特点
可以为任意复杂的层次结构(递归)生成类 可以读取您现有的 Java 类,如果它可以反序列化为这些结构,就会这样做 存在歧义时会提示用户输入【讨论】:
【参考方案2】:我知道有很多答案,但在所有这些中,我发现这个对我最有用。下面的这个链接在一个单独的文件中为您提供了所有 POJO 类,而不是一些提到的网站所做的一个巨大的类:
https://json2csharp.com/json-to-pojo
它也有其他转换器。此外,它可以在线工作,没有大小限制。我的 JSON 很大,而且效果很好。
【讨论】:
【参考方案3】:试试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 spec 发展了很多。它仍处于草稿阶段(未定稿),但已接近完成,现在是指定结构规则的可行工具
我最近启动了一个新的开源项目,专门用于解决您的问题:jsonschema2pojo。 jsonschema2pojo 工具采用 json 模式文档并生成 DTO 样式的 Java 类(以 .java 源文件的形式)。该项目尚未成熟,但已经涵盖了 json 模式中最有用的部分。我正在寻找用户的更多反馈,以帮助推动开发。现在您可以从命令行或作为 Maven 插件使用该工具。
希望这会有所帮助!
【讨论】:
那么使用您的 jsonschema2pojo 工具的人是否必须编写自己的模式文件? OP 要求从 Json 文件开始,而不是模式。是否有从 Json -> Schema 出发的配套工具?我假设这样的工具,如果存在的话,只能提供猜测。 从 0.3.3 版开始,您可以使用普通的旧 JSON 作为输入 :) ...现在还有一个在线生成器:jsonschema2pojo.org 优秀的工具。提供的链接包含一个在线工具,您可以在其中粘贴示例 JSON,单击按钮并获取 Java 源代码。 @testerjoe 如果你的意思是 Java 源代码,那么 jsonschema2pojo 就是这样做的,它可以作为 maven 插件、ant 任务、gradle 扩展、CLI 工具、java 库等使用......【参考方案4】:我创建了一个执行此操作的 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
【讨论】:
【参考方案5】:这是一个online tool,它将采用 JSON,包括嵌套对象或嵌套对象数组,并生成带有 Jackson 注释的 Java 源代码。
【讨论】:
这对我来说非常有效。我有深度嵌套的 JSON,它工作得很好,尽管我确实必须修剪冗余部分以使整体大小低于 2k。使我能够编写: MyClass c = new MyClass(); c = gson.fromJson(c.gethtml(someURLthatReturnsJSON), MyClass.class);结果数据完美流动。我不得不删除所有那些杰克逊符号,但否则它对 gson 工作得很好。谢谢。 谢谢,它有效。当我输入一个带有区分大小写字段的 JSON 时,这个站点返回了一个结果,而 www.jsonschema2pojo.org 报告了一个错误。 我今天能够生成一些 java 代码,但它随后停止工作。相应的文本区域不再存在...【参考方案6】:试试我的解决方案
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 生成 pojo 的方法【参考方案7】:用最近的项目回答这个老问题;-)。
目前最好的解决方案可能是JsonSchema2Pojo:
它使用很少使用的 Json Schema 来完成这项工作,但也可以使用普通的 Json。它提供了 Ant 和 Maven 插件,online test application 可以让您了解该工具。我放了一条 Json Tweet 并生成了所有包含的类(Tweet、User、Location 等)。
我们将在 Agorava 项目中使用它来生成社交媒体映射并跟踪其 API 中的不断演变。
【讨论】:
这也是我的印象,但我还没有尝试过 Maven 插件,但是在线版本非常慢,并且除了通常的 Person 类之外的任何东西都死了......所以为了快速在线转换, @tim-boudreau 的工具最适合我。 我试过 JsonSchema2Pojo 但点击预览按钮会弹出空白预览。【参考方案8】:您也可以尝试 GSON 库。它非常强大,它可以从集合、自定义对象创建 JSON,反之亦然。它在 Apache License 2.0 下发布,因此您也可以在商业上使用它。
http://code.google.com/p/google-gson/
【讨论】:
不创建 java 定义 这不是问题所在【参考方案9】:我遇到了同样的问题,所以我决定开始编写一个小工具来帮助我解决这个问题。我要分享并开源它。
https://github.com/BrunoAlexandreMendesMartins/CleverModels
它支持来自 JSON 的 JAVA、C# 和 Objective-c。
请随意贡献!
【讨论】:
【参考方案10】:我知道这是一个老问题,但我在尝试自己寻找答案时偶然发现了它。
提到在线 json-pojo 生成器 (jsongen) 的答案很好,但我需要一些可以在命令行上运行并进行更多调整的东西。
所以我编写了一个非常 hacky 的 ruby 脚本来获取一个示例 JSON 文件并从中生成 POJO。它有许多限制(例如,它不处理匹配 java 保留关键字的字段),但在许多情况下它已经足够了。
默认情况下,生成的代码带有注释以供 Jackson 使用,但可以通过开关关闭。
你可以在github上找到代码:https://github.com/wotifgroup/json2pojo
【讨论】:
【参考方案11】:添加到@japher 的帖子。如果您不是特别依赖 JSON,Protocol Buffers 值得一试。
【讨论】:
Protocol Buffers 甚至没有接近关于如何从 JSON 创建 Java 对象的答案。至少你应该推荐一个从协议缓冲区创建 Java 对象的工具。【参考方案12】:据我所知,没有这样的工具。然而。
我怀疑,主要原因是,与 XML 不同(它具有 XML Schema,然后在 XML 和 POJO 定义之间使用像“xjc”这样的工具来完成您所要求的工作),没有完全功能的模式语言。有 JSON Schema,但它对实际类型定义的支持很少(专注于 JSON 结构),因此生成 Java 类会很棘手。但可能仍然有可能,尤其是。如果定义了一些命名约定并用于支持生成。
但是:这是经常被请求的东西(在我关注的 JSON 工具项目的邮件列表中),所以我认为在不久的将来会有人编写这样的工具。
所以我认为这本身不是一个坏主意(另外:这不是所有用例的好主意,取决于你想做什么)。
【讨论】:
【参考方案13】:感谢所有试图提供帮助的人。 对我来说,这个脚本很有帮助。它只处理平面 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 生成 Java 类?的主要内容,如果未能解决你的问题,请参考以下文章