JsonObject null 的神坑

前端之家收集整理的这篇文章主要介绍了JsonObject null 的神坑前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

现在开源的 Json 序列化方案层出不穷,在性能和使用方面,都取得了很好的效果,比较常用的包括 Gson,FastJson 等等。然后对于初学者而言,或者不想引入额外框架的情况下,在这些场景下,还是会使用 JsonObject 这种基础对象。今天的文章,就是说一说 JsonObject 的神坑。

来看看这个例子,这样的一个 Json 键值对。

  1. {
  2. "userName":null }

和下面的这个 Json 键值对。

  1. {
  2. "userName":"null" }

区别就在 value 上面,一个是实际的 null,另一个是字符串 “null”。我们知道这两个区别很大,但本着科学的态度,我们先用 Gson 来做一下测试,看看情况是否是我们想象中的那样。

新建了一个 People 的类,方便通过 Gson 进行反序列化。

  1. public class People implements Serializable {
  2.  
  3. private static final long serialVersionUID = -7182026066461954852L;
  4.  
  5. public String userName;
  6.  
  7. }

再通过实际的代码,来进行测试。

  1. Gson gson = new Gson();
  2. People p1= gson.fromJson("{\n" +
  3. " \"userName\":null\n" +
  4. "}",People.class);
  5. People p2 = gson.fromJson("{\n" +
  6. " \"userName\":\"null\"\n" +
  7. "}",People.class);
  8. Log.d("tango",String.valueOf(TextUtils.isEmpty(p1.userName)));
  9. Log.d("tango",String.valueOf(TextUtils.isEmpty(p2.userName)));

最后输出的结果,分别是 truefalse,符合我们的预期。

接下来看看 JsonObject 的表现如何,代码很简单,如下所示。

  1. try {
  2. JSONObject jsonObject1 = new JSONObject("{\n" +
  3. " \"userName\":null\n" +
  4. "}");
  5. Log.d("tango",jsonObject1.getString("userName"));
  6. } catch (JSONException e) {
  7. e.printStackTrace();
  8. }
  9.  
  10. try {
  11. JSONObject jsonObject2 = new JSONObject("{\n" +
  12. " \"userName\":\"null\"\n" +
  13. "}");
  14. Log.d("tango",jsonObject2.getString("userName"));
  15. } catch (JSONException e) {
  16. e.printStackTrace();
  17. }

这个地方不会崩溃吗?按道理上讲 jsonObject1.getString("userName") 这里是 null 呀,可是没有!它真的没有,真的没有。即使是 null,不是字符串null,JsonObject 也能神奇地返回字符串 null,这真是天坑呀,比地缝都大啊。

在知道原因以后,解决起来也很容易,在 JsonObject 提供了判断的方法,是 JsonObject.isNull。当然,可以的话,尽量不用 JsonObject ,毕竟不但慢,而且代码可读性差。


文档信息

猜你在找的Json相关文章