8

我想解析一个 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 块。我一直在寻找更快(更优雅)的解决方案。

4

6 回答 6

16

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

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

于 2013-10-07T18:29:51.510 回答
9

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

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

永远不应该吞下异常。至少记录一个错误。

于 2013-10-07T17:48:08.913 回答
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();
        }
于 2013-10-07T17:54:58.297 回答
0

我认为这更多的是图书馆问题。Java 中的几个 JSON 库倾向于在其库调用中添加异常,就好像设计者想要使用侵入性的 C 类错误状态代码,但增加了 Java 异常语法的权重。我可以部分理解这种界面的动机,但它看起来真的很不雅。

我建议使用json-simple,这有时太简单了,但可以完成工作并且不碍事。

于 2013-10-07T18:11:51.987 回答
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 中的任何内容都不匹配,则不会出现错误,反之亦然。

于 2013-10-07T20:24:34.173 回答
0

代替

jsonObject.getFoo("key")

jsonObject.optFoo("key")

如果未找到该键,null则返回一个或类似的默认值,而不是引发异常。

于 2013-10-07T18:29:25.600 回答