java - 解析 JSONObject 时的异常处理

标签 java json

我正在解析一个大型 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. 
}

如果代码在设置 foobar 时失败,执行上下文将跳转到 catch block 内的错误处理步骤。违规行后面的函数调用永远不会运行,因此 barbaz 可能永远不会被设置,即使它们存在于原始 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/

相关文章:

java - List<JSONObject> 与 JSONArray

ruby-on-rails - Rails 和有源模型串行器 : prevent double JSON encoding and escape characters (\)

java - JAXB 覆盖 package-info.java : What should be "namespace"?

java - Maven:复制到 FTP 抛出 java.io.IOException:非法搜索

JavaFX 如何并排居中多个组件

c# - 在 WebAPI 中返回空的 json

json - Play Framework Scala 格式的大型 JSON(未找到 unapply 或 unapplySeq 函数)

java - 如何在包含 HTML 的 JLabel 中获取省略号?

java - 返回随机 boolean 值并用于引导 "if"语句

python - 在mongodb中插入python对象