Java:JSONObject中get空对象

郎家岭伯爵 2023年11月19日 161次浏览

问题

在阿里巴巴的 FASTJSON 中,在 get 对象时遇到这样一个问题:键存在,但获取对象后,对对象的操作报 空指针异常

解决

问题复现

代码段如下:

@GetMapping("/t8")
public void test8(){
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("lang", "");
    System.out.println("获取的String为:" + jsonObject.getString("lang"));
    System.out.println("对获取的String对象进行操作:" + jsonObject.getString("lang").toString());
    System.out.println("获取的JSONObject为:" + jsonObject.getJSONObject("lang"));
    System.out.println("对获取的JSONObject对象进行操作:" + jsonObject.getJSONObject("lang").toJSONString());
}

控制台输出:

获取的String为:
对获取的String对象进行操作:
获取的JSONObject为:null
2023-11-19 23:06:17.414 ERROR 3056 --- [nio-8081-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

java.lang.NullPointerException: null

问题原因

从输出中相信大家已经看出了问题所在:即在对 JSONObject 进行操作时,如果是 jsonObject.getString() 方法获取字符串,那么获取到的是空字符串而非 NULL;如果是 jsonObject.getJSONObject() 方法获取 JSONObject 对象,那么获取到的是 NULL,所以空指针异常也就很好理解了。

注意:如果我们获取一个不存在的键值,例如获取 jsonObject.getString("lan"); ,那么获取到的也是 NULL

总结

在使用 FASTJSON 时,如果 JSONObject 的键值不存在,那么获取到的是一个 NULL。在开发中需要避免因此导致的空指针异常。

捐赠页面示例