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


当前回答

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

其他回答

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

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

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

试试http://www.jsonschema2pojo.org

或者Maven的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模式,请删除这一行。

2014年更新:自2009年12月提出这个问题以来,发生了两件事:

The JSON Schema spec has moved on a lot. It's still in draft (not finalised) but it's close to completion and is now a viable tool specifying your structural rules I've recently started a new open source project specifically intended to solve your problem: jsonschema2pojo. The jsonschema2pojo tool takes a json schema document and generates DTO-style Java classes (in the form of .java source files). The project is not yet mature but already provides coverage of the most useful parts of json schema. I'm looking for more feedback from users to help drive the development. Right now you can use the tool from the command line or as a Maven plugin.

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

我怀疑,主要原因是,不像XML(它有XML Schema,然后像“xjc”这样的工具可以在XML和POJO定义之间做你想做的事情),没有完全特性的模式语言。有JSON Schema,但是它很少支持实际的类型定义(主要关注JSON结构),所以生成Java类会很棘手。但是可能仍然是可能的,特别是如果定义并使用一些命名约定来支持生成的话。

然而,这是一些相当频繁的要求(在我所关注的JSON工具项目的邮件列表中),所以我认为在不久的将来会有人编写这样的工具。

所以我不认为它本身是一个坏主意(而且:它对所有用例都不是一个好主意,这取决于你想做什么)。

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