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

Flutter读取本地目录JSON报错?如何正确导入本地JSON?

问题出在哪?为什么不能这么导入?

首先说你遇到的错误:当你用as data导入JSON文件时,data是一个导入前缀,不是文件内容字符串哦。Dart里的导入前缀是用来区分不同导入的命名空间的,必须用data.xxx的形式访问里面的成员,但JSON文件本身不是Dart模块,根本没有可访问的成员,所以直接把data传给json.decode肯定会报错。

至于为什么不能通过这种本地导入方式读取JSON?原因有两个:

  • Dart本身就不支持直接导入非Dart源文件(比如JSON、txt)来获取其内容字符串,这种导入语法对非Dart文件是无效的,Dart不知道该怎么处理它。
  • 对Flutter移动端来说,非assets目录的文件在打包时不会被包含到应用包中,就算你写对了代码,运行时也找不到这个文件。
正确的解决办法

方法1:把JSON作为Assets导入(推荐,跨平台通用)

这是Flutter里读取静态JSON的标准姿势,不管是iOS/Android/Web还是桌面都能用:

  1. 先配置pubspec.yaml
    在flutter节点下添加assets的路径,比如你的JSON在项目根目录,就这么写:

    flutter:
      assets:
        - json_data.json
    

    如果文件在子目录(比如data/json_data.json),就写完整路径就行。

  2. 在dart文件里读取解析
    用rootBundle加载assets里的文件,再转成JSON对象:

    import 'dart:convert';
    import 'package:flutter/services.dart';
    
    // 封装成异步方法,因为加载assets是异步操作
    Future<Map<String, dynamic>> loadMyJson() async {
      String jsonContent = await rootBundle.loadString('json_data.json');
      return json.decode(jsonContent);
    }
    
    // 使用示例
    void main() async {
      var myData = await loadMyJson();
      print(myData['foo']); // 会输出bar
    }
    

方法2:用dart:io读取(仅适用于桌面/服务器Dart项目)

如果你的项目是纯Dart控制台应用,或者Flutter桌面项目(能访问本地文件系统),可以用dart:io的File类来读:

import 'dart:convert';
import 'dart:io';

void main() async {
  File jsonFile = File('json_data.json');
  String jsonContent = await jsonFile.readAsString();
  Map<String, dynamic> myData = json.decode(jsonContent);
  print(myData['foo']); // 输出bar
}

⚠️ 注意:这种方式在Flutter移动端绝对不能用!因为移动端应用的沙箱机制不允许访问项目目录的文件,而且打包后这个文件也不会出现在应用里。

内容的提问来源于stack exchange,提问作者rahul Kushwaha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:22:40