我有一个相当大的 json 文件,我使用我的 flutter 应用程序从 Web api 下载了该文件,该文件大约 200MB 使用
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 阅读器来顺序解码它?
最佳答案
感谢@pskink,我设法解决了我的问题。我使用 Dio 中的 ResponseType.stream 来获取可以使用 JsonDecoder 中的 reviver 函数参数进行处理的流。我处理reviver中的所有数据,并忽略监听器的onData
函数中的数据。
...
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;
...
关于json - 如何在flutter中解码大型json数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63861625/