我想解析一个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块。我一直在寻找更快(更优雅)的解决方案。
答案 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中的任何字段不匹配,则无错误,反之亦然。