使用布尔和数组解析大型JSON

时间:2014-01-03 19:47:34

标签: android json parsing streaming gson

怎么了?

我有一个JSON,它有一个布尔值作为项目1和一个“Socio”对象数组作为项目2,我必须阅读流式传输,因为它非常大。

我的+ 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但是它正在使用具有名称的对象,所以我无法使用它来获取数组。

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

1 个答案:

答案 0 :(得分: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();
...