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

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结构对应的模型类,规范解析逻辑,提升代码可读性和可维护性:

  1. 定义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?,
    );
  }
}
  1. 修改解析方法:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:10:26