在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行才能实现这一点?


当前回答

如果你正在使用Jackson(那里最受欢迎的库),试试吧

https://github.com/astav/JsonToJava

它是开源的(最后更新于2013年6月7日至2021年),任何人都可以贡献。

总结

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

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

特性

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

其他回答

你也可以试试GSON库。它非常强大,它可以从集合,自定义对象和作品中创建JSON,反之亦然。它是在Apache许可证2.0下发布的,所以你也可以在商业上使用它。

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

添加到@japher的帖子。如果您不是特别依赖于JSON,那么Protocol Buffers值得一试。

我也有同样的问题,所以我决定开始写一个小工具来帮助我解决这个问题。我要分享并开源它。

https://github.com/BrunoAlexandreMendesMartins/CleverModels

它支持,JAVA, c#和Objective-c从JSON。

欢迎投稿!

试试我的解决方案

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 get

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

我知道这是一个老问题,但我是在自己试图寻找答案的时候偶然发现的。

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

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

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

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