【问题标题】:Android gson streaming from assets来自资产的 Android gson 流式传输
【发布时间】:2012-06-03 08:34:01
【问题描述】:

我有 9 MB txt 文件,里面有 json 对象。我需要解析使用 gson 流, 我已经完成了


     AssetManager assetManager = activity.getAssets();
            InputStream inputStream;
            inputStream = assetManager.open(fileName);
            JsonReader reader = new JsonReader(new InputStreamReader(inputStream,
                    "UTF-8"));
    JsonElement json = new JsonParser().parse(reader);
                JsonArray array = json.getAsJsonArray();
                Gson gson = new Gson();
                String interationString;
                for (JsonElement jsonElement : array) {
                    interationString = jsonElement.getAsJsonObject().get("drug")
                            .toString();
                    Log.d("drug", interationString);
                    Drug drug = gson.fromJson(interationString, Drug.class);
                    Log.d("drug", "" + drug);
                    DatabaseManager.getInstance().saveDrug(drug);
                }

我已将 json 文件放入 assest。但是在 4.0 的设备上工作,但在模拟器 2.3 中它不起作用并显示日志

05-29 11:19:41.290: D/dalvikvm(164): GC_EXPLICIT freed 74K, 46% free 3344K/6151K, external 1323K/1554K, paused 84ms
05-29 11:19:46.330: D/dalvikvm(373): GC_EXPLICIT freed 2K, 51% free 2718K/5511K, external 716K/1038K, paused 87ms
05-29 11:19:51.370: D/dalvikvm(203): GC_EXPLICIT freed 15K, 51% free 3083K/6215K, external 716K/1038K, paused 102ms
05-29 11:19:56.391: D/dalvikvm(573): GC_EXPLICIT freed 53K, 51% free 2771K/5639K, external 964K/1467K, paused 79ms

然后停止,我尝试解析小文件,它工作正常。 任何人都可以帮助解析Android中的长文件,以便它可以在所有Android设备上运行。

谢谢。

【问题讨论】:

标签: android gson


【解决方案1】:

通过将流解析与 Gson 的数据绑定相结合,您将获得最佳性能。下面是一个可能适用于您的数据集的示例:

public List<Drug> readJsonStream(InputStream in) throws IOException {
    JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
    List<Drug> drugs = new ArrayList<Drug>();
    reader.beginArray();
    while (reader.hasNext()) {
        reader.beginObject();
        while (reader.hasNext()) {
            String name = reader.nextName();
            if (name.equals("drug")) {
                Drug drug = gson.fromJson(reader, Drug.class);
                drugs.add(drug);
            } else {
                reader.skipValue();
            }
        }
        reader.endObject();
    }
    reader.endArray();
    reader.close();
    return drugs;
}

请注意,对beginArray/endArraybeginObject/endObject 的调用必须平衡。更多详情请访问Gson's streaming guide

【讨论】:

  • +1 - GSON 上的 DOM 方法实现起来很快,但处理大型响应却很慢。我将它用于原型,然后优化到流式生产方法。我认为更多的人需要意识到 GSON 并没有那么慢,而是你如何使用它(不是说它是最快的,只是很多人不使用流媒体)
【解决方案2】:

看起来您正在使用 android 附带的 vanilla XML 解析 - 它使用了一种 DOM 模型,并将完整的 JSON 吞入内存中的对象模型中(这就是您所看到的 - 大量的内存分配)。

您应该确保您的解析器使用拉模型。我的选择是 GSON,因为它的内存占用比 jackson 低。这是我在 GSON 之上使用的小型数据绑定库 解析我的大 JSON 数据:

https://github.com/ko5tik/jsonserializer

【讨论】:

  • 不,您正在使用原始 JSON 解析器将完整模型吞入内存,然后对其进行迭代,将 JSON 对象转换回字符串并再次使用 GSON 解析它以获取数据绑定 - 这就是您的性能没了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 2018-02-23
  • 2018-07-04
  • 2013-07-05
  • 2017-07-09
  • 2011-04-03
相关资源
最近更新 更多