跳转至

b. Json与POJO的转换

b. Json与POJO的转换

更新日期:2021-01-11


1. 概述

在程序中使用Json文件来存储数据是一种越来越流行的方法。使用Google提供的Gson库可以帮助我们解决处理Json时遇到的各种问题。

2. 利用工具从Json反向生成POJO类

觉得手写POJO类很烦是吗?是的,我也这么认为,很多人都这么认为的,于是便有了这些解放我们双手的工具。而且这样的工具有很多。

比如,这个网页版的POJO生成工具:

网址:jsonschema2pojo

jsonschema2pojo

POJO生成工具

也可以在我们的IDE里面安装插件。比如在Intellij IDEA中可以安装下面这个插件:

POJO生成工具

下面以IDEA的插件为例,来演示一下这个过程。

首先我们准备一个Json文件。

src/main/resources/json/test.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
"numbers": [
    1,
    2,
    3
],
"isAFile": true,
"color": "gold",
"heList": null,
"number": 123,
"action": {
    "a": 123,
    "c": "d"
},
"message": "Hello World"
}

然后我们随便创建一个类,就叫MyDataClass好了。在类内部空白处点右键选择生成,就可以看见如下选项。

然后我们把准备的Json文件的内容贴进入,还可以在设置里面更改很多选项。这里可以指定生成Gson样式的POJO类。

POJO生成工具

一顿OK之后,POJO类就生成出来了。长下面这个样子。(由于选择了使用lombok,所以看上去很简洁。)

POJO生成结果

 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package org.example;

import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@NoArgsConstructor
@Data
public class MyDataClass {

    /**
    * numbers : [1,2,3]
    * isAFile : true
    * color : gold
    * heList : null
    * number : 123
    * action : {"a":123,"c":"d"}
    * message : Hello World
    */

    @SerializedName("isAFile")
    private Boolean isAFile;
    @SerializedName("color")
    private String color;
    @SerializedName("heList")
    private Object heList;
    @SerializedName("number")
    private Integer number;
    @SerializedName("action")
    private ActionDTO action;
    @SerializedName("message")
    private String message;
    @SerializedName("numbers")
    private List<Integer> numbers;

    @NoArgsConstructor
    @Data
    public static class ActionDTO {
        /**
        * a : 123
        * c : d
        */

        @SerializedName("a")
        private Integer a;
        @SerializedName("c")
        private String c;
    }
}

3. 使用Gson进行Json与DataClass之间的相互转换

Gson设计的非常简单易用。只需很少量的代码就可以完成我们的任务。

使用Gson

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 创建Gson对象
Gson gson = new Gson();

// Json文件 => DataClass
var jsonPath = App.class.getResource("/json/test.json").getPath();
MyDataClass dataClass = gson.fromJson(new FileReader(jsonPath), MyDataClass.class);

// DataClass => Json文字
MyDataClass newDataClass = new MyDataClass();
// 初始化newDataClass
String jsonRst = gson.toJson(newDataClass);

4. 完整的演示代码

演示代码

 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package org.example;

import com.google.gson.Gson;
import com.google.gson.stream.JsonReader;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.List;
import java.util.Map;

public class App {

    public static void main(String[] args) {

        try {
            // Json文件 => DataClass
            testLoadJson();

            // DataClass => Json文字
            testToJson();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Json文件 => DataClass
    private static void testLoadJson() throws FileNotFoundException {

        // 读取Json文件
        var jsonPath = App4.class.getResource("/json/test.json").getPath();

        // 使用Gson进行转换
        Gson gson = new Gson();
        MyDataClass myDataClass = gson.fromJson(new FileReader(jsonPath), MyDataClass.class);

        // 输出转换后的结果
        System.out.println("Json文件 => DataClass");
        System.out.println(myDataClass);
    }

    // DataClass => Json文字
    private static void testToJson() {

        // 创建DataClass
        MyDataClass dataClass = new MyDataClass();
        dataClass.setColor("green");
        MyDataClass.ActionDTO action = new MyDataClass.ActionDTO();
        action.setA(null);
        action.setC("This is c");
        dataClass.setAction(action);
        dataClass.setHeList(Map.of("a", 1, "b", 234));
        dataClass.setMessage("This is a message.");
        dataClass.setNumber(13566);
        dataClass.setNumbers(List.of(1, 2, 3, 5, 767, 99, 0));
        dataClass.setIsAFile(false);

        // 使用Gson进行转换
        Gson gson = new Gson();
        String json = gson.toJson(dataClass);

        // 输出转换结果
        System.out.println("DataClass => Json文字");
        System.out.println(json);
    }
}