【问题标题】:Parse JSON without succession of Try-Catch blocks在没有连续的 Try-Catch 块的情况下解析 JSON
【发布时间】:2013-10-07 17:46:51
【问题描述】:

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

【问题讨论】:

  • Gson 是一个 Java 库,可用于将 Java 对象转换为其 JSON 表示形式。它还可用于将 JSON 字符串转换为等效的 Java。参考:javacodegeeks.com/2011/01/…
  • 一个好的代码应该正确处理try-catch块而不是避免它。

标签: java android json


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

  • 您也可以只使用opt 方法而不是get 方法。如果无法检索到该值,这些将返回一个默认值,并且不会引发异常。但是,只有在值不存在是可以接受的情况下才应该使用它,否则您绝对应该处理异常情况。
  • @Sotirios 是的,但在第一个异常情况下它将停止解析 json。
  • @kcoppock 好的,谢谢!我不知道那个功能。如果您将其作为答案,我可以接受:)
  • @DanieleVitali 这是一个例外,你应该处理它。考虑使用 kcoppock 提出的建议。
  • @SotiriosDelimanolis 如果操作人员想知道获取哪个特定字段(名称或 ID)给出了异常,那么您将两个字段放在同一个 try 块中的答案不会有用吗?跨度>
【解决方案3】:

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

您可以将所有读取的 json 放入一个方法中,并让该方法抛出 JSONException,如下所示:

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

但是当你调用该方法时,你必须做一个 try catch:

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

【讨论】:

  • 也许我不清楚。我的意思是,当由于没有我正在寻找的标签而出现异常时,我将继续进行下一个标签检查,而不是处理异常。为此,我必须编写上面发布的代码,但我将连续使用 try-catch 块。我一直在寻找一种更快(更优雅)的解决方案,就像@kcoppock 的解决方案一样。希望现在更好:)
【解决方案4】:

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

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

【讨论】:

  • 我同意你的想法。但是使用 opt 方法是一个很好的(和优雅的)替代方案:)
【解决方案5】:

替换

jsonObject.getFoo("key")

jsonObject.optFoo("key")

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

【讨论】:

    【解决方案6】:

    如果您想要更简洁的语法,您应该查看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 中的任何内容都不匹配,则不会出现错误,反之亦然。

    【讨论】:

      猜你喜欢
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      相关资源
      最近更新 更多