在没有连续Try-Catch块的情况下解析JSON

时间:2013-10-07 17:46:52

标签: java android json

我想解析一个JSON,但每次得到一个值时,我都必须把指令放在try-catch块中。这是一个例子:

try {
        this.setID(jsonObject.getLong("id"));
    } catch (JSONException e) {
    }
    try {
        this.setName(jsonObject.getString("name"));
    } catch (JSONException e) {
    }
//and so on....

我不在乎指令是否出现异常。所以我想知道是否可以删除所有try-catch块并将所有指令放在一起。

实际上它更像是一个java问题而且不仅仅是一个android问题......

修改

只是澄清问题所在。 当因为没有我正在寻找的标签而出现异常时,我会继续进行下一个标签检查,而不是处理异常。要做到这一点,我必须编写上面发布的代码,因此需要一系列try-catch块。我一直在寻找更快(更优雅)的解决方案。

6 个答案:

答案 0 :(得分:11)

您可以使用opt方法而不是get方法,假设密钥不存在是可以的。如果密钥不是可选的,并且您的应用无法从那些并非全部存在的字段中恢复,那么您肯定应该使用get方法并在遇到错误时快速失败。

您可以使用的另一种有用的方法是has()方法。这将检查是否存在给定键的映射。 (例如if (json.has("id") id = json.optString("id")))。

答案 1 :(得分:8)

也许我不明白你在问什么,但为什么不把所有来电jsonObject都放在同一个try-catch块中呢?

try {
    this.setID(jsonObject.getLong("id"));
    this.setName(jsonObject.getString("name"));
} catch (JSONException e) {
    // log or consume it some other way
}

你应该从不只是吞下例外。至少记录错误。

答案 2 :(得分:1)

就像@Sotirios说你不能忽视json异常。

您可以将所有json读取放在方法中,并使该方法抛出JSONException,如下所示:

    public void readJson(String json) throws JSONException{
     this.setID(jsonObject.getLong("id"));
     this.setName(jsonObject.getString("name"));
   }

但是当您调用该方法时,钢铁必须尝试捕获:

    try {
            readJson(jLine);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

答案 3 :(得分:0)

我认为它更像是一个库问题而不是其他任何东西。 Java中的一些JSON库倾向于在其库调用中添加异常,就像设计者想要使用类似入侵C的错误状态代码一样,但增加了Java异常语法的权重。我可以部分理解这种界面的动机,但它看起来真的很不优雅。

我建议使用json-simple,这有时过于简单,但可以完成工作并且不会停止。

答案 4 :(得分:0)

替换

jsonObject.getFoo("key")

jsonObject.optFoo("key")

如果找不到密钥,则返回null或类似的默认值,而不是抛出异常。

答案 5 :(得分:0)

如果您想要更清晰的语法,请查看gson。如果你知道json会是什么样子,没有什么能比得上它。

如果你的JSON看起来像这样:

{
    "id": 432942039,
    "name": "My name",
    "values": [0, 1, 2, 3]
}

您将创建一个如下所示的POJO类:

public class MyClass {
    public MyClass() {}
    private long id;
    private String name;
    private int[] values;
}

并解析它:

private parse(String jsonString) {
    Gson gson = new Gson();
    MyClass myObject = gson.fromJson(jsonString, MyClass.class);
}

就是这样。不需要制定者;它使用反射来匹配字段。没有注释。如果您的JSON字符串中的字段与POJO中的任何字段不匹配,则无错误,反之亦然。