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

Dart解析JSON时强转_JsonMap为List<List<double>>触发TypeError

问题核心错误定位

你遇到的类型异常根本不是浮点数转换的问题,是两个叠加的层级/类型误判:

  • 原始JSON结构中,geometry是一个对象(对应jsonDecode解析后生成的_JsonMap也就是Map<String, dynamic>类型),它的内部才存在coordinates键,这个键对应的二维数组才是你需要的坐标列表。
  • 你当前代码直接把geometry这个Map对象强转为List<List<double>>,类型完全不匹配,自然会抛出“_JsonMap不是List<List<double>>子类型”的异常。
修正后的核心逻辑

需要调整取值链路,同时按照Dart JSON解析的规则做逐层类型收敛:

  1. 先从Route的Map数据中取出geometry对应的Map对象
  2. 从geometry的Map对象中取出coordinates对应的原始数组
  3. 因为jsonDecode解析出的数组默认泛型是List<dynamic>,无法直接强转为List<List<double>>,需要遍历每一层元素做类型转换,把动态类型的数值统一转成double类型。就算你补上了取coordinates的步骤,直接写geometryMap['coordinates'] as List<List<double>>还是会因为泛型不匹配触发报错。
参考实现代码
class CoordinateList {
  CoordinateList({required this.list});
  CoordinateList.fromJSON(List<List<double>> data) :
    list = data.map((coordinate) => Position(lon: coordinate[1], lng: coordinate[0])).toList();
  List<Position> list = [];
}

class Route {
  Route({required this.geometry});
  factory Route.fromJSON(Map<String, dynamic> data) {
    // 取出geometry对应的Map结构
    final geometryMap = data['geometry'] as Map<String, dynamic>;
    // 从geometry中取出coordinates的原始动态数组
    final rawCoords = geometryMap['coordinates'] as List<dynamic>;
    // 逐层转换类型,把动态泛型转成目标的二维double列表
    final List<List<double>> coords = rawCoords.map((item) {
      final coordItem = item as List<dynamic>;
      return coordItem.map((numVal) => numVal.toDouble()).toList();
    }).toList();
    return Route(
      geometry: CoordinateList.fromJSON(coords)
    );
  }
  CoordinateList geometry;
}
Dart JSON解析的通用惯例
  • 不要盲目对解析结果做强转:jsonDecode生成的集合类,泛型默认全部是dynamic,直接强转成带具体泛型的集合类型,绝大多数情况会触发运行时类型异常。
  • 遇到类型报错优先核对JSON取值层级:先确认你取到的对象类型(是Map还是List)和你预期的类型是否一致,大部分新手报错都是因为少取了一层JSON字段。
  • 数值类型统一用num做中转转double/int,避免因为JSON里数值是整数(比如1而不是1.1)触发double强转异常。

按照上面的修正调整后,代码可以正常运行,成功输出解析后的Position坐标列表。


内容的提问来源于stack exchange,提问作者user3056783

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 20:27:05