【问题标题】:Parsing large JSON with Boolean and Array使用布尔值和数组解析大型 JSON
【发布时间】:2014-01-03 19:47:33
【问题描述】:

怎么了?

我有一个 JSON,其中第 1 项是布尔值,第 2 项是“Socio”对象数组,我必须使用流式传输读取,因为它非常大。

我的 +5.0MB JSON 是这样的:{"response":true,"result":[{SOCIO OBJECT}, {SOCIO OBJECT}...]

我的第一个代码(在 API 8、9 上抛出 OutOfMemoryError)是:

            InputStream source = f.retrieveStream(params[0]);
            Gson gson = new Gson();
            Reader reader = new InputStreamReader(source);

            Respuesta response = gson.fromJson(reader, Respuesta.class);
            Socio[] socios = response.getSocio();

我用于流式传输的新代码是:

            InputStream source = f.retrieveStream(params[0]);
            Gson gson = new Gson();
            JsonReader reader = new JsonReader(new InputStreamReader(source,"UTF-8"));
            reader.skipValue(); // Because I have to skip the response... Am i doing this right??
            lista = new ArrayList<Socio>();
            Socio soc;
            reader.beginArray();
            while (reader.hasNext()) {
                soc = gson.fromJson(reader, Socio.class);
                lista.add(soc);
            }
            reader.endArray();
            reader.close();

但是当它快要加载时它会抛出这个异常:

java.lang.IllegalStateException:应为 BEGIN_ARRAY,但在第 1 行第 4716089 列为 END_DOCUMENT

代码所在行:reader.beginArray();

This is 我的流式阅读的基础。

我已经阅读了很多关于 GSON 的解析,但我找不到任何用于解析 JSON 文件中的特定数组的内容。我只知道用 Android Json 库来做,但我需要使用 GSON。我还在 Google 上浏览了 this search 的前 10 页,但没有找到明确的回应,我理解 this SO question 但它适用于有名称的对象,因此我无法将其用于数组。

提前致谢。 问候。 拉斐尔。

【问题讨论】:

  • 我一开始打了个招呼,但是自动删除了它...:O

标签: android json parsing streaming gson


【解决方案1】:

你的流式代码是错误的,第一个 skipValue 实际上会让你跳过整个文档。

试试这个:

JsonReader reader = new JsonReader(new InputStreamReader(source,"UTF-8"));
jsonReader.beginObject();
while (jsonReader.hasNext()) {
    String strName = jsonReader.nextName();
    if (strName.equals("response")) {
        reader.skipValue();
    }
    else if (strName.equals("result")) {
        jsonReader.beginArray();
         while (reader.hasNext()) {
            soc = gson.fromJson(reader, Socio.class);
            lista.add(soc);
        }
        jsonReader.endArray();
    }
}
jsonReader.endObject();
...

【讨论】:

  • 我对自己有点失望,因为我更像是分析师而不是程序员......非常感谢,你的帮助非常棒
  • 不客气,Rafa,不要对自己太苛刻,我们都有希望自己表现更好的日子。
猜你喜欢
  • 2014-11-30
  • 2010-09-29
  • 2013-02-07
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多