You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:30:02