从JSON生成Java类?


215

在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中编写哪些行?


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

Answers:


269

尝试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 模式,请删除此行。

在2020年更新。自从2009年12月问这个问题以来,发生了两件事:

  • JSON模式规范已经转移了很多。它仍在草稿中(尚未定稿),但即将完成,现在是指定结构规则的可行工具

  • 我最近启动了一个新的开源项目,专门用于解决您的问题:jsonschema2pojo。jsonschema2pojo工具采用json模式文档,并生成DTO样式的Java类(以.java源文件的形式)。该项目尚未成熟,但已经涵盖了json模式最有用的部分。我正在寻找用户的更多反馈意见,以帮助推动开发。现在,您可以从命令行或作为Maven插件使用该工具。

希望这可以帮助!


4
那么使用您的jsonschema2pojo工具的人是否不必编写自己的模式文件?OP要求以Json文件而不是模式开头。Json-> Schema是否有配套的工具?我认为这样的工具(如果存在)只能提供一个猜测。
杰夫·阿克塞尔罗德

3
从0.3.3版本开始,您可以使用普通的旧JSON作为输入:)
joelittlejohn 2012年

14
...现在也有了在线生成器:jsonschema2pojo.org
joelittlejohn 2012年

2
优秀的工具。提供的链接包含一个在线工具,您可以在其中粘贴示例JSON,单击按钮并获取Java源代码。
mbmast

1
@testerjoe如果您是说Java源代码,那么jsonschema2pojo可以做到这一点,并且可以作为maven插件,ant任务,gradle扩展,CLI工具,java库等使用
joelittlejohn

21

如果您使用的是杰克逊(那里最受欢迎的图书馆),请尝试

https://github.com/astav/JsonToJava

它的开源和任何人都应该能够贡献力量。

摘要

一个JsonToJava源类文件生成器,该生成器根据提供的示例json数据推导架构并生成必要的java数据结构。

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

特征

  • 可以为任意复杂的层次结构生成类(递归)
  • 可以读取您现有的Java类,如果可以将其反序列化为这些结构,则可以这样做
  • 存在歧义情况时将提示用户输入

13

这是一个在线工具,将使用JSON(包括嵌套对象或嵌套对象数组)并生成带有Jackson批注的Java源代码。


1
这对我来说很不错。我已经深度嵌套了JSON,并且效果很好,尽管我必须修剪多余的部分才能使整体大小低于2k。使我能够编写:MyClass c = new MyClass(); c = gson.fromJson(c.getHTML(someURLthatReturnsJSON),MyClass.class); 结果数据完美地流动。我必须删除所有那些Jackson表示法,但对于gson来说效果很好。谢谢。
noogrub

谢谢,它有效。当我使用区分大小写的字段输入JSON时,此网站返回了结果,而www.jsonschema2pojo.org报告了错误。
CoolMind

6

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

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

它很少使用Json Schema,但也使用纯Json来完成此工作。它提供了Ant和Maven插件,并且在线测试应用程序可以使您对该工具有所了解。我放了一个Json Tweet并生成了所有包含的类(Tweet,User,Location等。)。

我们将在Agorava项目上使用它来生成社交媒体映射,并遵循其API中不断发展的趋势。


这也是我的印象,但是我还没有尝试过Maven插件,但是在线版本相当慢,并且会死于除普通Person类之外的任何东西...因此,对于快速在线转换,@ tim-boudreau的工具最适合我。
2015年

我尝试了JsonSchema2Pojo,但单击“预览”按钮会弹出空白预览。
AndroidDev

5

感谢所有尝试提供帮助的人。
对我来说,这个脚本很有帮助。它仅处理平面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("}");

5

我知道这是一个古老的问题,但是在尝试自己找到答案时,我偶然发现了这个问题。

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

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

默认情况下,生成的代码会注释供杰克逊使用,但是可以通过开关将其关闭。

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


2

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

我怀疑,主要原因是与XML不同(XML具有XML Schema,然后有诸如'xjc'之类的工具可以在XML和POJO定义之间执行您所要求的工作),没有完全功能的模式语言。有JSON Schema,但是它对实际的类型定义(主要针对JSON结构)几乎没有支持,因此生成Java类非常棘手。但可能仍然可能,尤其是。是否定义了一些命名约定并用于支持生成。

但是:(在我遵循的JSON工具项目的邮件列表中)经常需要这种请求,所以我认为有人会在不久的将来编写这样的工具。

因此,我认为这本身并不是一个坏主意(同样:对于所有用例,它也不是一个好主意,取决于您要执行的操作)。





0

添加到@japher的帖子。如果您不特别喜欢JSON,则值得一试的是Protocol Buffers


1
协议缓冲区甚至还不能解决如何从JSON创建Java对象的答案。至少您应该推荐一种用于从协议缓冲区创建Java对象的工具。
james.garriss 2014年

0

试试我的解决方案

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的方法
拉斐尔·鲁伊斯·塔巴雷斯

0

让我向您展示如何开发该工具。您可以这样做:

  1. 用户javascript函数Json.parse(),将字符串like-json转换为js对象
  2. 然后使用该对象生成javabean格式。
  3. 某些事情,您应该注意。(1)值类型映射,例如,如何找出字符串,是日期类型。(2)loweser_case至camelCase

我开发了一个工具来解决问题。它设计精良,速度更快。从我的github获取代码。

从这里开始享受它,我已经将它部署在了Web服务器上

我尝试了前2个答案的建议。一个网络无法打开。一个比我的工具慢。希望您会喜欢我的工具。


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
Achrome
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.