首页 > 解决方案 > 如何在颤动中解码大型json数组

问题描述

我有一个相当大的 json 文件,我使用我的颤振应用程序从一个大约 200MB 的 web api 下载了该文件

final response = Dio().get(uri, options: Options(responseType: ResponseType.plain));

(使用默认的 Dio 选项也使用 json 解码,导致内存不足异常。这不是我的问题的直接部分,但也许有帮助)

现在问题在获取 json 字符串后开始。当我在响应正文上使用 jsonDecode 时,我的内存不足。(也许 Dio 使用的功能相同?)

final data = jsonDecode(response.body);这内存不足

json 对象本身是一个包含许多项目的数组,其格式如下:

[
  {"data": {independent data1}},
  {"data": {independent data2}},
  ...
]

我会很好地一次解码一项而不是一次解码所有内容以减少内存使用。有没有另一种方法来处理这个数组中的所有项目?就像是

jsonArrayDecode(response.body, onItemDecode: (item) { /*do stuff with item */ });

还是我必须编写自己的可以顺序解码的json阅读器?

标签: jsonflutter

解决方案


感谢@pskink,我设法解决了我的问题。我使用ResponseType.streamfrom Dio 获取流,可以使用JsonDecoder. 我处理reviver中的所有数据,忽略onDatalistener函数中的数据。

...
final response = await dio.get(uri,
        options: Options(responseType: ResponseType.stream);
Function reviver = (key, value) {
  if (/*value is element from top level list*/) {
    processItem(value);
    return null;
  }
  return value;
}
final completer = Completer();
response.data.stream.cast<List<int>>()
        .transform(utf8.decoder)
        .transform(JsonDecoder(reviver))
        .listen(null,  onDone: () { completer.complete(); });
await completer.future;
...

推荐阅读