我正在解析一个大型 JSONArray
(大约 33000 个项目)的 JSON 对象。我正在我的应用程序中将 JSON 对象转换为我自己的对象。它看起来有点像下面这样:
Card card = Card.build(cardObj.getString("name"))
.setFoo(cardObj.getString("foo"))
.setBar(cardObj.getInt("bar"))
.setBaz(cardObj.getString("baz"))
... about 10 more
问题是所有卡片(在原始 JSON 中)没有相同的 key 。因此,我的解析器中的每一行代码都必须有一个 try catch block ,因为任何异常都必须在代码继续执行之前得到处理。例如,如上面的代码片段所示,如果我正在解析一个没有 bar
的对象,那么代码将立即跳转到异常处理,跳过设置 baz
值。
我的问题:有没有一种方法可以避免 try catch 每一行?我知道您不能忽略异常,但也许有类似的东西可能会有所帮助。
更好的例子
try {
Card card = Card.build(cardObj.getString("name"))
.setFoo(cardObj.getString("foo"))
.setBar(cardObj.getInt("bar"))
.setBaz(cardObj.getString("baz"))
} catch (JSONException e) {
// The code will jump here for any exception.
}
如果代码在设置 foo
或 bar
时失败,执行上下文将跳转到 catch block 内的错误处理步骤。违规行后面的函数调用永远不会运行,因此 bar
或 baz
可能永远不会被设置,即使它们存在于原始 JSON 中。除了 try catch 每一行或检查以确保每个值事先存在之外,我看不出有什么方法可以防止这种情况。难道就没有更好的办法了吗?
最佳答案
如果您的 JSON 库有处理默认值的方法,我强烈建议使用它并传递 null
或任何足够好的方法作为默认值。
该方法可能类似于 jsonObject.getString(String key, String defaultValue)
。
但是,如果您的 JSON 库没有为您提供使用默认值的方法,您可以将每个 getXXX()
调用包装在方法中,该方法负责处理这样的异常:
String getOrDefault(JSONObject obj, String key, String defValue) {
try {
String value = obj.getString(key);
return value;
}
catch (Exception ex) {
return defValue;
}
}
// similary create functions for all data types.
然后在构建器部分使用:
Card card = Card.build(getOrDefault(cardObj, "name", null))
... about 10 more
关于java - 解析 JSONObject 时的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44740652/