从 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>

&lt;sourceType&gt;json&lt;/sourceType&gt; 涵盖了源为 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 类?的主要内容,如果未能解决你的问题,请参考以下文章

从 Java 类生成 JSON 模式

GraphQL Java 类生成器 [关闭]

根据json生成java实体类

从 C# 类生成 JSON 模式

java-生成任意格式的json数据

json字符生成Java实体类--用好bejson