如何将POJO转换为JSON,以及如何将JSON转换为POJO?

71

我想知道是否有可用的Java API可以将一个POJO对象转换为JSON对象,反之亦然。

6个回答

56

请看https://www.json.org

假设你有一个这样简单的Java类:

public class Person {

    private String name;
    private Integer age;

    public String getName() { return this.name; }
    public void setName( String name ) { this.name = name; }

    public Integer getAge() { return this.age; }
    public void setAge( Integer age ) { this.age = age; }

}

因此,将其转换为JSON对象非常简单。像这样:

import org.json.JSONObject;

public class JsonTest {

    public static void main( String[] args ) {
        Person person = new Person();
        person.setName( "Person Name" );
        person.setAge( 333 );
        
        JSONObject jsonObj = new JSONObject( person );
        System.out.println( jsonObj );
    }

}

这里有另一个例子,使用Jackson进行操作:https://brunozambiazi.wordpress.com/2015/08/15/working-with-json-in-java/

Maven:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.6.1</version>
</dependency>

以下是最新版本的链接:

https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22com.fasterxml.jackson.core%22%20AND%20a%3A%22jackson-databind%22


谢谢,但是我想知道如果我有一个 Pojo 对象,能否传递这个对象并让库构建 JSON 对象……Gson 能做到吗?你能给我一个例子吗?非常感谢。 - Mariah
@Bruno 我们如何使用这个 JSONObject 获取 List 或 Set 的值。 - Ankur Jain
11
我喜欢这种方法,但不幸的是它对我没用。我收到了错误消息:“构造函数JSONObject(Person)未定义”..你有任何想法为什么会这样吗?我正在一些安卓代码中调用它..这是纯Java。谢谢。 - Gene Bo
@gnB:我也遇到了同样的错误,如果你是在Android上尝试,则它正在引用http://developer.android.com/reference/org/json/JSONObject.html。因此,请尝试创建一个http://www.json.org/javadoc/org/json/JSONObject.html对象。 - Mahantesh M Ambi

33

如果您了解Jackson 2,则在mkyong.com上有一个很好的教程,介绍如何将Java对象与JSON相互转换。以下代码片段摘自该教程。

将Java对象转换为JSON,writeValue(...):

ObjectMapper mapper = new ObjectMapper();
Staff obj = new Staff();

//Object to JSON in file
mapper.writeValue(new File("c:\\file.json"), obj);

//Object to JSON in String
String jsonInString = mapper.writeValueAsString(obj);

将 JSON 转换为 Java 对象,使用 readValue(...) 方法:

ObjectMapper mapper = new ObjectMapper();
String jsonInString = "{'name' : 'mkyong'}";

//JSON from file to Object
Staff obj = mapper.readValue(new File("c:\\file.json"), Staff.class);

//JSON from URL to Object
Staff obj = mapper.readValue(new URL("http://mkyong.com/api/staff.json"), Staff.class);

//JSON from String to Object
Staff obj = mapper.readValue(jsonInString, Staff.class);

Jackson 2 依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.6.3</version>
</dependency>

请前往上方给出的链接获取完整教程。


20

我们还可以在pom文件中使用下面提供的依赖和插件 - 我使用maven。通过使用这些,您可以根据您的JSON模式生成POJO,然后使用下面给出的代码来通过指定为gson.toJson(Object src)参数的src对象填充请求JSON对象或反之亦然。请查看以下代码:

Gson gson = new GsonBuilder().create();
String payloadStr = gson.toJson(data.getMerchant().getStakeholder_list());

Gson gson2 = new Gson();
Error expectederr = gson2.fromJson(payloadStr, Error.class);

同时还需要 Maven 设置:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>1.7.1</version>
</dependency>

<plugin>
    <groupId>com.googlecode.jsonschema2pojo</groupId>
    <artifactId>jsonschema2pojo-maven-plugin</artifactId>
    <version>0.3.7</version>
    <configuration>
        <sourceDirectory>${basedir}/src/main/resources/schema</sourceDirectory>
        <targetPackage>com.example.types</targetPackage>
    </configuration>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
</plugin>

4
你可以使用 Jackson API 进行转换。
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.4</version>
</dependency>

在您的POM中添加上述Maven依赖项,在您的主方法中创建ObjectMapper。
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);

稍后我们需要将我们的 POJO 类添加到映射器中。
String json = mapper.writeValueAsString(pojo);

1
请参考以下内容将JSON转换为POJO对象,以及相反的操作。
假设您的JSON模式如下:
{
  "type":"object",
  "properties": {
    "dataOne": {
      "type": "string"
    },
    "dataTwo": {
      "type": "integer"
    },
    "dataThree": {
      "type": "boolean"
    }
  }
}

然后要转换为POJO,您需要按照以下样式声明一些类:

==================================
package ;
public class DataOne
{
    private String type;

    public void setType(String type){
        this.type = type;
    }
    public String getType(){
        return this.type;
    }
}

==================================
package ;
public class DataTwo
{
    private String type;

    public void setType(String type){
        this.type = type;
    }
    public String getType(){
        return this.type;
    }
}

==================================
package ;
public class DataThree
{
    private String type;

    public void setType(String type){
        this.type = type;
    }
    public String getType(){
        return this.type;
    }
}

==================================
package ;
public class Properties
{
    private DataOne dataOne;

    private DataTwo dataTwo;

    private DataThree dataThree;

    public void setDataOne(DataOne dataOne){
        this.dataOne = dataOne;
    }
    public DataOne getDataOne(){
        return this.dataOne;
    }
    public void setDataTwo(DataTwo dataTwo){
        this.dataTwo = dataTwo;
    }
    public DataTwo getDataTwo(){
        return this.dataTwo;
    }
    public void setDataThree(DataThree dataThree){
        this.dataThree = dataThree;
    }
    public DataThree getDataThree(){
        return this.dataThree;
    }
}

==================================
package ;
public class Root
{
    private String type;

    private Properties properties;

    public void setType(String type){
        this.type = type;
    }
    public String getType(){
        return this.type;
    }
    public void setProperties(Properties properties){
        this.properties = properties;
    }
    public Properties getProperties(){
        return this.properties;
    }
}

-3

使用GSON将POJO转换为JSONObject。请参考此处。

要将JSONObject转换为POJO,只需在POJO中调用setter方法,并直接从JSONObject分配值即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接