Android - 使用gson解析输入流

时间:2014-02-04 09:56:02

标签: android json sqlite gson

我正在研究一个Android项目,我有一个json响应解析。

{"key1":"val1","key2":"val2","key3":[{...}, {...}, {...}... upto 5000 elements]}

这就是我现在的json的样子。

我正在使用HttpUrlConnection将响应解析为流。

我也在使用gson使用自定义反序列化器解析此响应。

一切正常,但问题是一堆堆开始为这5000个对象增长。

我正在寻找一种可以单独获取对象并将其存储在本地数据库中的方法。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

如果您遇到内存问题,则表示您尝试将整个流反序列化到内存中。

Gson提供JsonStreamParser但不幸的是,这不适合您的用例 - 您在输入流中只有一个对象。调用.next()会读取整个对象,包括该数组。

Jackson,另一方面,通过其JsonParser类提供更细粒度的流媒体支持。您可以使用标记化来读取流中的每个字段:

MappingJsonFactory jfactory = new MappingJsonFactory();
JsonParser jParser = jfactory.createJsonParser(inputStream);

while (jParser.nextToken() != JsonToken.END_OBJECT)
{
    String fieldName = jParser.getCurrentName();

    if ("key3".equals(fieldname)) 
    {
        jParser.nextToken(); // current token is "[", move next

        // key3 is array, loop until token equal to "]"
        while (jParser.nextToken() != JsonToken.END_ARRAY) 
        {
            MyClass mc = jParser.readValueAs(MyClass.class);
            // store in your DB
        }
    }
}
jParser.close()

注意,以上内容完全未经测试;它只是为了展示这个概念。它应该指向正确的方向。