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还是桌面都能用:
先配置pubspec.yaml
在flutter节点下添加assets的路径,比如你的JSON在项目根目录,就这么写:flutter: assets: - json_data.json如果文件在子目录(比如
data/json_data.json),就写完整路径就行。在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
相关产品推荐
相关产品推荐

