将 JSON 字符串转为 Java 对象

2021/1/16
解决方案
Java Json

目前 Java 有很多 JSON 解析库,本文记录的是阿里巴巴的开源 JSON 解析库 fastjson 以及 Google 的 Gson, 来解析请求中的 JSON 字符串。

fastjson 这段时间被爆出很多漏洞呀,没想到我选了一个代码质量最差的和一个运行速度最慢的

# 使用 fastjson

fastjson GitHub 仓库:https://github.com/alibaba/fastjson (opens new window)

# Maven 引入 fastjson

在 maven 仓库下载 fastjson: http://repo1.maven.org/maven2/com/alibaba/fastjson/ (opens new window)

或者配置 maven 依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.61</version>
</dependency>

# 使用 JSONObject

当我们发送一个请求后获取到了 JSON 字符串,可以使用 JSONObject 把字符串转换为 JSON 对象

// 发送请求
RestTemplate connect = new RestTemplate();
// 获取响应
ResponseEntity<String> response = connect.getForEntity(url);
// 获取响应数据
String body = response.body();
// 把字符串转换为JSON对象(反序列化)
JSONObject JSONdata = JSONObject.parseObject(body);

JSONObject 对象有 put 和 get 方法可以来存入和获取值,使用方法和 Map 差不多,如果是嵌套的 JSON 数据(通过 key 获取到的对象本质也是一个 JSON 字符串), 要继续获取里面的值可以转为 JSONObject 对象

JSONObject jsonObj = new JSONObject();
// 传入数据
jsonObj.put("key", "value");
jsonObj.put("name", "aruki");
// 传入上面请求获取到的JSON对象
jsonObj.put("data", JSONdata);
// 获取数据
Object name = JSONdata.get("name");
JSONObject data = (JSONObject) respond.get("data");
// 可以直接获取字符串数据(序列化)
String info = data.getString("info");

当然 fastjson 的功能不仅仅这些,除了使用简单和速度快之外,fastjson 还有其他序列化和反序列化方式

参考官方例子:https://github.com/alibaba/fastjson/wiki/Samples-DataBind (opens new window)

# 使用注解的方式

public class User {
    @JSONField(name = "id")
    private Long id;

    @JSONField(name = "name")
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
ArrayList<User> userList = new ArrayList<>();

userList.add(new User(1001L,"1号"));
userList.add(new User(1002L,"2号"));

String jsonStr = JSON.toJSONString(userList);

jsonStr 的打印结果:

[
    {
        "id":1001,
        "name":1号,
    },
    {
        "id":1002,
        "name":2号,
    }
]

# 使用 Gson

Gson GitHub 仓库:https://github.com/google/gson (opens new window)

# 在项目中引入

Gradle:

dependencies {
  implementation 'com.google.code.gson:gson:2.8.6'
}

Maven:

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

# JSON 字符串转 Java 对象

拥有一个 User 类,通过 Gson 对象的fromJson()方法将 Json 字符串转换为 User 对象。

Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);

# Java 对象转换为 JSON 字符串

当我们拥有一个 User 对象 user,可以通过 Gson 对象的toJson()方法将对象转换为 Json 字符串。

gson.toJson(user)

如果字符串中存在 Null 的字段,那么使用这种方法将不会序列化 Null 的属性,可以通过 GsonBuilder 对象来创建自定义 Gson 对象。我们可以在 GsonBuilder 对象设置 serializeNulls 来支持 Null 字段的序列化。

GsonBuilder gsonBuilder = new GsonBuilder().serializeNulls();
Gson gson = gsonBuilder.create()

# 相关文档

Post Order
By Time : DESC
Article Statistics
Article: 35
Categories: 4
Tags: 18