如何在Java中调用Google Distance Matrix API获取距离及解析问题求助
解决Google Distance Matrix API JSON数据的距离信息提取问题
嘿,我看到你在提取Google Distance Matrix API返回的距离数据时卡壳了,咱们先把这个JSON结构拆明白,再一步步写代码提取,肯定能搞定!
首先,先理清楚你拿到的这个JSON的层级结构:
- 最外层是一个对象,包含
rows数组(因为API支持多起点多终点,所以用数组包裹结果) rows里的每一个元素是包含elements数组的对象,elements里的每个元素对应一组起点-终点的计算结果- 每个
element对象里的distance字段就是你要的距离信息,里面有两个子字段:text(可读性强的字符串,比如"13.1 km")和value(精确数值,单位是米,比如13133)
常用语言的提取示例
Python 示例
假设你已经把API返回的字符串解析成了Python字典,直接逐层访问即可:
import json # 替换成你实际获取到的JSON字符串 api_response = '''{ "destination_addresses" : [ "Some Address" ], "origin_addresses" : [ "Some other address" ], "rows" : [ { "elements" : [ { "distance" : { "text" : "13.1 km", "value" : 13133 }, "duration" : { "text" : "33 mins", "value" : 1961 }, "status" : "OK" } ] } ], "status" : "OK" }''' # 解析JSON为Python字典 data = json.loads(api_response) # 提取距离信息(因为是单起点单终点,直接取数组第一个元素) distance_text = data['rows'][0]['elements'][0]['distance']['text'] distance_value = data['rows'][0]['elements'][0]['distance']['value'] print(f"可读距离: {distance_text}") print(f"精确距离(米): {distance_value}")
JavaScript 示例
如果是在前端或Node.js环境中,解析后用点语法直接访问:
// 假设这是API返回并解析后的对象 const apiData = { "destination_addresses" : [ "Some Address" ], "origin_addresses" : [ "Some other address" ], "rows" : [ { "elements" : [ { "distance" : { "text" : "13.1 km", "value" : 13133 }, "duration" : { "text" : "33 mins", "value" : 1961 }, "status" : "OK" } ] } ], "status" : "OK" }; // 提取距离信息 const distanceText = apiData.rows[0].elements[0].distance.text; const distanceValue = apiData.rows[0].elements[0].distance.value; console.log(`可读距离: ${distanceText}`); console.log(`精确距离(米): ${distanceValue}`);
更健壮的写法(避免报错)
实际开发中,最好先检查状态和数组长度,防止因为API返回异常(比如无结果)导致代码崩溃:
Python 健壮版
import json api_response = '''{ "destination_addresses" : [ "Some Address" ], "origin_addresses" : [ "Some other address" ], "rows" : [ { "elements" : [ { "distance" : { "text" : "13.1 km", "value" : 13133 }, "duration" : { "text" : "33 mins", "value" : 1961 }, "status" : "OK" } ] } ], "status" : "OK" }''' data = json.loads(api_response) # 先检查整体请求状态 if data.get('status') == 'OK': # 检查rows数组是否有内容 if data.get('rows') and len(data['rows']) > 0: row = data['rows'][0] # 检查elements数组是否有内容 if row.get('elements') and len(row['elements']) > 0: element = row['elements'][0] # 检查当前起点终点的结果状态 if element.get('status') == 'OK': distance_text = element['distance']['text'] distance_value = element['distance']['value'] print(f"可读距离: {distance_text}") print(f"精确距离(米): {distance_value}") else: print(f"该组起点终点查询失败: {element['status']}") else: print("未找到elements数据") else: print("未找到rows数据") else: print(f"API请求失败: {data['status']}")
这样即使API返回异常,你的代码也不会直接报错,方便排查问题。
内容的提问来源于stack exchange,提问作者Shubham Dixit




