json - 如何在颤动中解码大型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阅读器?
解决方案
感谢@pskink,我设法解决了我的问题。我使用ResponseType.stream
from Dio 获取流,可以使用JsonDecoder
. 我处理reviver中的所有数据,忽略onData
listener函数中的数据。
...
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;
...
推荐阅读
- flutter - 如何使用 Flutter Driver 从 DropdownButton 中选择一个值?
- voltdb - 在 voltdb Adhoc 存储过程中将多个参数作为数组传递时出错
- logging - 仅适用于企业应用程序和本地的中央日志记录解决方案
- python - Python 将列表 1 [I] 与列表 2 [i] 连接
- javascript - 我无法在 jQuery 中更改 HTML
- intel-fpga - 如何让 DE0-nano 使用 ttl-232R-3V3 电缆与 PC 进行 1 位通信(使用冲突语言)?
- r - 如何计算data.frame中日期间隔的总和?
- c++ - 在通知条件变量之前添加一个空的锁定范围会防止丢失通知吗?
- java - MockBean 未注入 MVC 控制器测试
- kentico - Kentico:10 如何同时允许 E-Mail 和 Username 认证