Flutter中如何从Google Distance API的JSON提取多点间距离与时长
解决Google Distance API多点间距离/时长提取问题
Google Distance Matrix API的返回结构里,rows数组对应每个起点,每个row下的elements数组则是该起点到所有终点的距离、时长数据。你之前只取了rows[0],自然只能拿到第一个起点的结果,要获取所有多点间的数据,得遍历整个rows数组,再逐个遍历每个row里的elements。
基础遍历示例(直接提取数据)
假设你已经将API响应解码为Map<String, dynamic>类型的jsonResponse:
// 取出所有起点对应的rows数组 List<dynamic> rows = jsonResponse['rows']; // 遍历每个起点的row for (var row in rows) { // 取出当前起点到所有终点的elements数组 List<dynamic> elements = row['elements']; // 遍历每个终点对应的元素 for (var element in elements) { // 先判断接口返回状态是否正常,避免空指针 if (element['status'] == 'OK') { // 提取距离的文本(如"10 km")和数值(如10000,单位米) String distanceText = element['distance']['text']; int distanceMeters = element['distance']['value']; // 提取时长的文本(如"15 mins")和数值(如900,单位秒) String durationText = element['duration']['text']; int durationSeconds = element['duration']['value']; // 这里可以把数据存到列表、模型类,或者直接使用 print('距离:$distanceText,时长:$durationText'); } else { print('该点对无法获取数据:${element['status']}'); } } }
用模型类管理数据(更规范)
如果数据量大,建议用自定义模型类来封装数据,避免重复代码:
// 定义模型类 class RouteInfo { final String distanceText; final int distanceMeters; final String durationText; final int durationSeconds; RouteInfo({ required this.distanceText, required this.distanceMeters, required this.durationText, required this.durationSeconds, }); // 从JSON元素转成模型 factory RouteInfo.fromJson(Map<String, dynamic> json) { return RouteInfo( distanceText: json['distance']['text'], distanceMeters: json['distance']['value'], durationText: json['duration']['text'], durationSeconds: json['duration']['value'], ); } }
然后用模型类批量处理数据:
List<List<RouteInfo>> allRouteData = []; List<dynamic> rows = jsonResponse['rows']; for (var row in rows) { List<dynamic> elements = row['elements']; // 把当前row的所有element转成模型,存入列表 List<RouteInfo> singleStartPointData = elements .where((e) => e['status'] == 'OK') // 过滤异常数据 .map((e) => RouteInfo.fromJson(e)) .toList(); allRouteData.add(singleStartPointData); } // 使用时,allRouteData[i][j] 表示第i个起点到第j个终点的路线数据
内容的提问来源于stack exchange,提问作者Flutter Beginner
相关产品推荐
相关产品推荐

