json - 如何在flutter中解码大型json数组

标签 json flutter

我有一个相当大的 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/

相关文章:

sql - 查询 JSON 类型内的数组元素

javascript - Json 编码 数组与仅转换为数组的对象的混合

flutter - 如何将 FloatingActionButton 定位在屏幕的右下角

android - 在 Dart/Flutter 中,如何检查 Textfield 中输入的日期是否有效?

firebase - 哪种设定模式更好用

flutter - 自定义 Flutter 图标位置

php - 当变量存在时ajax下拉框

c# - 将 JSON 对象转换为 Data.Entities.Models.MyModel

java - 如何使用 jackson 从嵌套的 Json 字符串中获取 2 个值

firebase - Flutter和Firebase:基本结构问题