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


当前回答

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

其他回答

谢谢所有想帮忙的人。对我来说,这个脚本很有帮助。它只处理普通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("}");

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

我怀疑,主要原因是,不像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

谷歌地图地理编码API: https://github.com/inder123/geocoding

这里有一个在线工具,它将接受JSON,包括嵌套对象或嵌套对象数组,并生成带有Jackson注释的Java源代码。

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

https://github.com/astav/JsonToJava

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

总结

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

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

特性

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