从JSON生成Java类?

Generate Java class from JSON?

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

1
2
3
4
5
6
7
8
{
 "firstName":"John",  
 "lastName":"Smith",  
 "address": {  
   "streetAddress":"21 2nd Street",  
    "city":"New York"
  }
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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"));
    }
}

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


尝试:

http://www.jsonschema2pojo.org

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

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

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

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

希望这可以帮助!


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

https://github.com/astav/JsonToJava

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

摘要

JsonToJava源类文件生成器,它根据提供的示例json数据推断模式,并生成必要的Java数据结构。

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

特征

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


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


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

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

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

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


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

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

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

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

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


感谢所有试图提供帮助的人。
对我来说这个脚本很有帮助。它只处理平面JSON并且不处理类型,而是自动化一些例程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  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("}");


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

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


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

https://github.com/BrunoAlexandreMendesMartins/CleverModels

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

随意贡献!


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

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

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

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


我创建了一个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


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

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

    从这里享受它,我已经在网络服务器上部署它。

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


    试试我的解决方案

    http://htmlpreview.github.io/?https://raw.githubusercontent.com/foobnix/android-universal-utils/master/json/generator.html

    1
    2
    3
    4
    5
    6
    7
    {
       "auctionHouse":"sample string 1",
       "bidDate":"2014-05-30T08:20:38.5426521-04:00",
       "bidPrice": 3,
       "bidPrice1": 3.1,
       "isYear":true
    }

    结果Java类

    1
    2
    3
    4
    5
    private String  auctionHouse;
    private Date  bidDate;
    private int  bidPrice;
    private double  bidPrice1;
    private boolean  isYear;

    JSONObject得到

    1
    2
    3
    4
    5
    auctionHouse = obj.getString("auctionHouse");
    bidDate = obj.opt("bidDate");
    bidPrice = obj.getInt("bidPrice");
    bidPrice1 = obj.getDouble("bidPrice1");
    isYear = obj.getBoolean("isYear");

    JSONObject放

    1
    2
    3
    4
    5
    obj.put("auctionHouse",auctionHouse);
    obj.put("bidDate",bidDate);
    obj.put("bidPrice",bidPrice);
    obj.put("bidPrice1",bidPrice1);
    obj.put("isYear",isYear);


    添加到@ japher的帖子。如果您没有特别依赖JSON,则协议缓冲区值得一试。