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解析的规则做逐层类型收敛:
- 先从Route的Map数据中取出
geometry对应的Map对象 - 从geometry的Map对象中取出
coordinates对应的原始数组 - 因为
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
相关产品推荐
相关产品推荐

