返回

** 单薄的JSONObject,为何引来迷茫的风暴?

后端

SEO关键词:

文章

很简单的一个接口,写的时候很自信。都不带测试的,直接部署让前端使用,结果打脸了,而且还是一脸懵逼的错误。

@PostMapping("/api/update")
public JSONObject update(@RequestBody JSONObject json) {
    JSONObject result = new JSONObject();
    if (json.has("name")) {
        result.put("name", json.getString("name"));
    }
    if (json.has("age")) {
        result.put("age", json.getInt("age"));
    }
    return result;
}

正常情况下,前端会发送一个类似于{"name":"John Doe", "age":30}的JSON对象,后端会相应地构建一个新的JSON对象,并返回给前端。但是,当前端发送一个{"name":"John Doe"}这样的JSON对象时,后端就会崩溃,抛出一个NullPointerException异常。

起初,我百思不得其解。我已经检查了代码,它看起来没有任何问题。JSON对象具有has方法,可以检查键是否存在。如果不存在,我只需跳过即可。

if (json.has("name")) {
    result.put("name", json.getString("name"));
}

但是,当我使用调试器一步一步地执行代码时,我发现json.has("name")返回true,但json.getString("name")抛出了NullPointerException异常。这是怎么回事?

经过一番深入研究,我意识到JSONObject类使用反射来获取和设置字段。这意味着,如果字段不存在,它将抛出NullPointerException异常。

Field field = jsonObject.getClass().getDeclaredField("name");
field.setAccessible(true);
Object value = field.get(jsonObject);

为了解决这个问题,我需要在获取字段值之前检查字段是否存在。

if (json.has("name")) {
    result.put("name", json.isNull("name") ? null : json.getString("name"));
}

这次,代码按预期工作。我学到了一个宝贵的教训:即使是最简单的代码也可能隐藏着意想不到的陷阱。在部署代码之前,始终进行测试非常重要。此外,在处理JSON对象时,请务必记住反射的特性,并相应地编写代码。