如何避免 JSONObject Null 检查

蒂姆

我有像下面这样的 JSON

{
  "a1": "aaa",
  "b1": 333,
  "c1": {
    "c1": "ccc",
    "d1": "ddd",
    "f1": [
      {"a1": "xyz"},
      {"b1":  "lmn"},
      {"c1":123.00}
    ]
  }
}

我正在将文件读入 String 并创建一个 JSONObject 如下

JSONObject json = new JSONObject(new JSONTokener(str));

JSON 是从外部传入我的应用程序,因此内容有时会大不相同。假设它可以完全为空,或者某些元素可以为空,或者数组大小可以为 0 或 1 或更多等。

当我处理 JSONObject 时,我可以继续使用

json.has and !=null 

这样它就不会抛出任何异常。

我可以有如下代码

if(
      json.has("c") 
   && json.getJSONObject("c")!= null 
   && json.getJSONObject("c").has("f") 
   && json.getJSONObject("c").getJSONArray("f").length() > 1 
   &&json.getJSONObject("c").getJSONArray("f").getJSONObject(1).has("b")
  ){     
      String x = json.getJSONObject("c").getJSONArray("f").getJSONObject(1).getString("b");
   }

这使得代码具有一长串 if 条件。

但是我在想,我可以用 try catch 将语句括起来

try {
     String x = json.getJSONObject("c").getJSONArray("f").getJSONObject(1).getString("b");
    }catch(JSONException e) {
        //log and proceed
    }

请建议在这种情况下是否有任何正当理由放置一个长 if 条件,而不仅仅是尝试 - 捕获 - 记录并继续。

如果在这种情况下使用 JSONException 有任何“优点”,您也可以分享吗?

康拉德·霍夫纳

选项 0:长 If 语句

我认为这太复杂了,尤其是当链条变长时。我会考虑远程类似解决方案的唯一情况是,如果用户需要确切地知道问题出在哪里,并且有关于如何解决这个问题以及在非常特定的用例中如何发生这种情况的具体指导方针,但是在那个如果你需要大量的 if 语句和 log 语句。

选项 1:尝试捕获

正如您所建议的,Try-catch 确实是可能的,但是您需要确保捕获在 JSON 字段不存在或类型错误时可能发生的所有可能的异常,例如 ClassCastException 和 NullPointerException。它很短但不是很优雅,正如其他回答者所说可能会隐藏其他异常(但您仍然可以记录堆栈跟踪)。

选项 2:Java 8 可选

另一种选择是找到一个允许您使用 Java 8 Optional 类型的库。例如,建议使用Jackson这更优雅,但也可能成为一个大链。此外,这还为您的项目增加了一个依赖项。

选项 3:路径表达式

第三种选择是使用路径表达式JsonPath,您可以将所有语句放入一个表达式中并获得所有结果。在我看来,这是完美的用例,也是迄今为止最好的解决方案。唯一的缺点是这给您的项目增加了一个依赖项。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章