Flutter读取assets本地JSON解析后控制台输出null问题排查
问题根因
解析逻辑和JSON结构不匹配:
- 你的JSON根节点是一个包含
title字段的对象,title字段对应的值是DataTitle类型的数组,不是单个DataTitle实例 - 现有
loadData方法直接把根节点对象传入DataTitle.fromJson(),根节点本身不存在number、firstarray、secondarray字段,所以解析出的属性全为null/空数组 - 你预先定义的、匹配根节点结构的
DataModel类没有被使用。
修复方案
- 首先确认
pubspec.yaml中已正确注册JSON文件所在的assets目录,示例配置:
flutter: uses-material-design: true assets: - assets/ # 如果你把json文件放在assets根目录,直接注册目录即可,也可以写具体文件路径
- 修正
loadData方法的解析逻辑,使用根模型DataModel承接解析结果,再从数组中取对应的数据:
// 注意需要引入flutter/services.dart才能用rootBundle import 'package:flutter/services.dart'; Future loadData() async { // 替换为你自己的JSON文件实际路径 String jsonString = await rootBundle.loadString('assets/data.json'); final jsonResponse = json.decode(jsonString); // 用匹配根结构的DataModel解析 DataModel rootModel = DataModel.fromJson(jsonResponse); // 取数组第一个元素,即你预期的number=8的那条数据 if (rootModel.measure != null && rootModel.measure!.isNotEmpty) { DataTitle target = rootModel.measure!.first; print('${target.number} - ${target.firstarray?.join(', ')} - ${target.secondarray?.join(', ')}'); } }
补充说明
- 你的JSON文件中数组末尾多余的尾随逗号不影响Dart原生json解码器的解析,若需要多端兼容可手动删除
- 整数类型值(比如你数组里的27)调用
toDouble()后会转为27.0,属于正常类型转换,若需要格式化显示为整数可自行处理数值展示逻辑 - 修复后运行代码,控制台将输出符合预期的结果:
flutter: 8 - 26.6, 27.0, 26.6, 22.9, 27.1, 26.8 - 26.6, 27.0, 26.6, 22.9, 27.1, 26.8
内容的提问来源于stack exchange,提问作者CDC
相关产品推荐
相关产品推荐

