Dart读取大JSON文件报错:Failed to decode data using encoding 'utf-8'
在Dart中读取大TXT文件中的JSON数据
你遇到的Failed to decode data using encoding 'utf-8'错误不一定由文件大小直接导致,更可能是文件编码非UTF-8,或是一次性读取大文件时的编码处理问题。以下是针对大JSON文件的读取方案:
方案1:流式读取(低内存占用)
通过流式分块读取文件,避免一次性加载整个文件到内存,同时处理编码:
import 'dart:convert'; import 'dart:io'; import 'package:path_provider/path_provider.dart'; Future<void> readLargeJson() async { final Directory directory = await getApplicationDocumentsDirectory(); final File file = File('${directory.path}/test_json.txt'); StringBuffer contentBuffer = StringBuffer(); // 流式读取并转码 await for (String chunk in file.openRead().transform(utf8.decoder)) { contentBuffer.write(chunk); } try { final jsonData = jsonDecode(contentBuffer.toString()); // 处理解析后的JSON数据 print("JSON解析完成"); } catch (e) { print("解析失败: $e"); } }
方案2:适配非UTF-8编码
如果文件实际编码不是UTF-8,可先以对应编码读取再转成UTF-8:
import 'dart:convert'; import 'dart:io'; import 'package:path_provider/path_provider.dart'; Future<void> readNonUtf8Json() async { final Directory directory = await getApplicationDocumentsDirectory(); final File file = File('${directory.path}/test_json.txt'); // 假设文件是latin1编码,先读取再转UTF-8 final rawContent = await file.readAsString(encoding: latin1); final utf8Content = utf8.decode(latin1.encode(rawContent)); try { final jsonData = jsonDecode(utf8Content); print("JSON解析完成"); } catch (e) { print("解析失败: $e"); } }
注意事项
- 先确认文件编码:用文本编辑器(如VS Code)查看文件实际编码,选择对应编码读取。
- 大文件优先用流式读取:减少内存占用,避免内存溢出。
- 若JSON结构极大,可考虑使用支持分块解析的第三方库,但原生Dart需读取完整JSON字符串后解析。
内容的提问来源于stack exchange,提问作者Farrukh
相关产品推荐
相关产品推荐

