如何在Flutter中访问本地嵌套JSON数据及获取对应实现示例
本地离线JSON读取的Firebase相关说明
- 读取随应用打包的固定离线JSON文件,完全不需要将其上传至Firebase Storage。这类本地资源直接配置为Flutter应用的assets资产即可离线读取,加载无网络依赖、速度更快,也不会占用Firebase的存储配额。
- 仅当JSON内容需要不发版动态更新、文件体积过大不想占用安装包体积、需要多端共享同一份动态JSON时,才有必要将文件上传至Firebase Storage,通过网络拉取的方式读取。
指定嵌套结构JSON的Flutter读取实现
你提供的JSON片段存在语法缺失(缺少多层闭合括号),先给出修正后的合法结构参考:
[ [ { "nos": 0, "name": "nnnnnnnasdfnnn", "unique_id": "adfadfd", "reg_details": [ { "registered_with": "adfasdfasdf" }, { "type_of_ngo": "zzzzzzzz" }, { "registration_no": "zzzzzxxx" } ] } ] ]
具体实现步骤
- 项目目录下新建
assets文件夹,将合法的JSON文件存入该目录 - 在项目根目录的
pubspec.yaml中配置资产路径:
flutter: assets: - assets/你的JSON文件名.json
- 编写读取逻辑,通过全局资产加载器读取文件内容,经JSON解析后顺着嵌套层级逐层取值,示例代码如下:
import 'dart:convert'; import 'package:flutter/services.dart' show rootBundle; Future<void> parseNestedJson() async { // 读取本地JSON文件的原始字符串 final String rawJson = await rootBundle.loadString('assets/你的JSON文件名.json'); // 解析为Dart可操作的嵌套列表结构 final List<dynamic> outerArray = jsonDecode(rawJson); // 外层数组的第一个元素为第二层嵌套数组 final List<dynamic> secondArray = outerArray[0]; // 第二层数组的第一个元素为存储核心属性的Map对象 final Map<String, dynamic> coreInfoMap = secondArray[0]; // 读取顶层属性 final int nos = coreInfoMap['nos']; final String ngoName = coreInfoMap['name']; final String uniqueId = coreInfoMap['unique_id']; // 读取嵌套的reg_details数组(注意:该数组每个元素为单独的单键Map) final List<dynamic> regDetailList = coreInfoMap['reg_details']; final String registeredWith = regDetailList[0]['registered_with']; final String ngoType = regDetailList[1]['type_of_ngo']; final String regNo = regDetailList[2]['registration_no']; // 验证读取结果 print('机构名称:$ngoName,注册号:$regNo'); }
注意:该结构的
reg_details并非传统的单Map多属性结构,每个注册属性单独作为数组的一个元素存在,取值时必须通过数组索引定位对应属性,不能直接使用coreInfoMap['reg_details']['registered_with']的方式取值,否则会触发类型不匹配报错。
内容的提问来源于stack exchange,提问作者Bill_The_Coder
相关产品推荐
相关产品推荐

