14

我正在尝试使用 gson 在 android 模拟器上进行对象映射。

处理 208 kb 左右的 json 数据时速度慢得离谱。我的 json 中没有任何层次结构。

对象映射完成后,我可以看到 gson 创建了大约 500 条记录。

在 android 模拟器上映射输入 json 需要 3 多分钟。

我已经注释了我的实体,它由字符串和几个浮点数组成。

我错过了什么?

任何想法,最佳实践都会有很大帮助。

有什么方法可以快速对象映射 json 数据?

        URL myURL = new URL(url);
        /* Open a connection to that URL. */
        URLConnection ucon = myURL.openConnection();
        /*
         * Define InputStreams to read from the URLConnection.
         */
        InputStream is = ucon.getInputStream();
        InputStreamReader reader = new InputStreamReader(is);
        long tickCount = System.currentTimeMillis();
        Policy[] policies = new Gson().fromJson(reader, Policy[].class);
        long endCount = System.currentTimeMillis() - tickCount;
        Log.d("Time to pull policies in milliseconds", "" + endCount);
4

5 回答 5

5

我以前见过这样的问题,普遍的共识是杰克逊比 Gson 快得多。有关更多信息,请参阅以下链接:

这是专门讨论 Android 的一个:http ://ubikapps.net/?p=525

于 2010-07-16T00:24:19.497 回答
4

您是否尝试过将 GSON 流解析器与 Gson 对象混合?http://sites.google.com/site/gson/streaming(查找混合阅读示例)。

这种方法可能会有所帮助,因为 Gson 会读取整个解析树然后对其进行操作。对于大型数组列表,读取所有元素并尝试解析可能会导致大量内存交换(或抖动)。这种方法将一次读取一个元素。

希望这可以帮助。

于 2011-04-25T21:50:41.397 回答
2

如果你用一个很好的大缓冲区把它包装起来,你可能会得到更好InputStreamBufferedInputStream性能......

3分钟太疯狂了。我很少运行模拟器,但我有一个带有 ~1.1MB JSON 资产的应用程序,在硬件上加载和处理大约需要 5 秒。

(这仍然太长了,但仍然)。

于 2011-02-15T22:34:06.173 回答
1

我发现通过不对 JSON 中不需要的所有元素进行建模,我可以大大加快 gson.fromJSON 的速度。GSON 很乐意只填写您的响应类中指定的内容。

于 2013-02-20T15:56:26.390 回答
1

我发现创建 Gson 实例是一项非常昂贵的操作,无论是在 CPU 使用量还是内存分配方面。

由于 Gson 实例是线程安全的,因此构造和重用单个静态实例是有回报的,尤其是在您经常序列化/反序列化的情况下。

于 2016-09-03T05:03:04.070 回答