【问题标题】:Generate Java class from JSON?从 JSON 生成 Java 类?
【发布时间】: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 行才能实现这一点?

【问题讨论】:

  • 我已经更新了问题和答案,使它们成为主题。请重新打开。

标签: java json


【解决方案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("}");
              

              【讨论】:

                猜你喜欢
                • 2014-11-29
                • 2013-03-08
                • 2019-01-11
                • 2013-10-28
                • 1970-01-01
                • 1970-01-01
                • 2015-07-16
                • 2014-01-17
                • 1970-01-01
                相关资源
                最近更新 更多