Flutter本地JSON映射为列表时触发绑定错误,求解决方案
Flutter本地JSON解析的类型绑定错误解决办法
本地存储了JSON文件,已成功访问,但将JSON数据存入列表时触发绑定错误,相关代码和JSON结构如下:
问题代码
Future<void> readJson() async { final response = await rootBundle.loadString('assets/json/units.json'); final data = await json.decode(response); setState(() { List jsonList = data["length"]; print(jsonList); }); }
JSON数据结构
{ "length" : [ { "name": "Meter", "conversion": 1.0, "base_unit": true }, { "name": "Millimeter", "conversion": 1000.0 }, { "name": "Centimeter", "conversion": 100.0 } ] }
错误原因
Dart是强类型语言,json.decode()返回的是dynamic类型,直接将data["length"]赋值给List时,编译器无法确定其具体类型,因此触发类型绑定错误。
解决方法
方法1:显式类型转换(快速修复)
将data["length"]强制转换为List<dynamic>,同时添加空检查避免潜在空指针问题:
Future<void> readJson() async { final response = await rootBundle.loadString('assets/json/units.json'); // 显式指定data的类型为Map<String, dynamic> final data = json.decode(response) as Map<String, dynamic>; setState(() { // 强制转换为List<dynamic>,并做空检查 List<dynamic>? jsonList = data["length"] as List<dynamic>?; if (jsonList != null) { print(jsonList); } }); }
方法2:创建数据模型类(推荐,适合复杂业务场景)
定义与JSON结构对应的模型类,规范解析逻辑,提升代码可读性和可维护性:
- 定义
Unit模型类:
class Unit { final String name; final double conversion; final bool? baseUnit; // 可选参数,部分对象无此字段 Unit({ required this.name, required this.conversion, this.baseUnit, }); // 从JSON对象转换为Unit实例 factory Unit.fromJson(Map<String, dynamic> json) { return Unit( name: json['name'] as String, // 兼容JSON中可能的整数类型,转为double conversion: (json['conversion'] as num).toDouble(), baseUnit: json['base_unit'] as bool?, ); } }
- 修改解析方法:
Future<void> readJson() async { final response = await rootBundle.loadString('assets/json/units.json'); final data = json.decode(response) as Map<String, dynamic>; setState(() { // 将JSON数组转换为Unit对象列表 List<Unit> unitList = (data["length"] as List<dynamic>) .map((item) => Unit.fromJson(item as Map<String, dynamic>)) .toList(); print(unitList); }); }
额外注意事项
- 确保
pubspec.yaml中已正确配置资源路径,否则会无法读取JSON文件:
flutter: assets: - assets/json/units.json
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

