从JSON生成Java类?

时间:2009-12-24 08:37:08

标签: java json

我想要一个从JSON生成java源文件的实用程序。例如,我们有

{
  "firstName": "John",  
  "lastName": "Smith",  
  "address": {  
    "streetAddress": "21 2nd Street",  
     "city": "New York"
  }
}

我们将它传递给实用程序,我们希望它生成这样的内容:

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

写起来并不难,但我确信有人已经这样做了。

14 个答案:

答案 0 :(得分:247)

尝试:

http://www.jsonschema2pojo.org

Orsol,我相信你还没有在这里等待解决方案,但为了找到这个帖子的下一个人,我想我会添加更多信息。

自2009年12月问及此问题以来,发生了两件事:

  • JSON Schema spec已经发生了很多变化。它仍在草案中(尚未最终确定),但它已接近完成,现在是指定结构规则的可行工具

  • 我最近开设了一个新的开源项目,专门用于解决您的问题:jsonschema2pojo。 jsonschema2pojo工具获取json模式文档并生成DTO样式的Java类(以.java源文件的形式)。该项目尚未成熟,但已经提供了对json模式最有用部分的报道。我正在寻求用户的更多反馈,以帮助推动开发。现在,您可以使用命令行中的工具或Maven插件。

希望这有帮助!

答案 1 :(得分:20)

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

https://github.com/astav/JsonToJava

它的开源,任何人都应该能够贡献。

<强>摘要

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

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

功能

  • 可以为任意复杂的层次结构(递归地)生成类
  • 可以读取您现有的Java类,如果它可以反序列化为这些结构,那么
  • 在存在不明确的情况时会提示用户输入

答案 2 :(得分:12)

这里是一个online tool,它将采用JSON,包括嵌套对象或嵌套的对象数组,并使用Jackson注释生成Java源代码。

答案 3 :(得分:6)

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

目前,最佳解决方案可能是JsonSchema2Pojo

它很少使用Json Schema,但也使用普通的Json。它提供了Ant和Maven插件,online test application可以让您了解该工具。我放了一个Json Tweet并生成了所有包含的类(推文,用户,位置等)。

我们将在Agorava项目中使用它来生成社交媒体映射,并跟踪其API中的不断变化。

答案 4 :(得分:5)

我知道这是一个老问题,但我在试图找到答案时偶然发现了它。

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

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

默认情况下,生成的代码会注释与Jackson一起使用,但可以通过开关关闭。

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

答案 5 :(得分:4)

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

答案 6 :(得分:2)

据我所知,没有这样的工具。爱好。

主要原因是,我怀疑,与XML(其中包含XML Schema,然后像'xjc'这样的工具来执行您所要求的,在XML和POJO定义之间)不同,没有完全特征的模式语言。有JSON Schema,但它几乎不支持实际的类型定义(专注于JSON结构),因此生成Java类会很棘手。但可能仍有可能,尤其是如果定义了一些命名约定并用于支持生成。

然而:这是经常被请求的东西(在我关注的JSON工具项目的邮件列表中),所以我认为有人会在不久的将来编写这样的工具。

所以我认为这本身并不是一个坏主意(同样:对所有用例来说,这不是一个好主意,取决于你想做什么)。

答案 7 :(得分:2)

我遇到了同样的问题所以我决定开始编写一个小工具来帮助我解决这个问题。我要分享并开放它。

https://github.com/BrunoAlexandreMendesMartins/CleverModels

它支持JAVA,C#和来自JSON的Objective-c。

随意贡献!

答案 8 :(得分:1)

您也可以尝试GSON库。它非常强大,它可以从集合,自定义对象和工作中创建JSON,反之亦然。它在Apache License 2.0下发布,因此您也可以在商业上使用它。

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

答案 9 :(得分:1)

我创建了一个执行此操作的github项目Json2Java。 https://github.com/inder123/json2java

Json2Java提供自定义,例如重命名字段和创建继承层次结构。

我使用该工具创建了一些相对复杂的API:

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

Google Maps Geocoding API:https://github.com/inder123/geocoding

答案 10 :(得分:1)

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

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

它也有其他转换器。此外,它可以在线工作而不受大小限制。我的 JSON 很大,而且运行良好。

答案 11 :(得分:0)

添加到@ japher的帖子。如果您与JSON没有特别关系,Protocol Buffers值得一试。

答案 12 :(得分:0)

让我告诉你如何开发这个工具。你可以这样做:

  1. 用户javascript函数Json.parse(),使字符串像-json trans转换为js对象
  2. 然后使用此对象生成javabean格式。
  3. 东西,你要小心。(1)值类型映射,例如,如何找出字符串,是日期类型。(2)loweser_case to camelCase
  4. 我开发了一个解决问题的工具。设计好,速度快。 从我的github获取代码。

    从这里享受它,我已经在webserver上部署了它。

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

答案 13 :(得分:-1)

尝试我的解决方案

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 put

obj.put("auctionHouse",auctionHouse);
obj.put("bidDate",bidDate);
obj.put("bidPrice",bidPrice);
obj.put("bidPrice1",bidPrice1);
obj.put("isYear",isYear);