如何序列化 ComputeRoutesResponse

问题描述 投票:0回答:1

当使用带有 python 的 Web 端点

requests
来通过 Google Cloud 计算路由时,
https://routes.googleapis.com/directions/v2:computeRoutes
,我得到了 json 格式的响应。 这就是我使用 python 构建请求的方式,它使我能够更好地处理收到的数据。

headers = {
    'Content-Type': 'application/json',
    'X-Goog-Api-Key': API_KEY,
    'X-Goog-FieldMask': 'routes.duration,routes.distanceMeters,routes.legs,routes.optimizedIntermediateWaypointIndex,geocodingResults',
}
data = {
    'origin': {
        'placeId': ORIGIN_ID
    },
    'destination': {
        'placeId': DESTINATION_ID
    },
    'intermediates': intermediates,
    'travelMode': 'DRIVE',
    'routingPreference': 'TRAFFIC_AWARE',
    'departureTime': '2024-07-06T10:00:00Z',
    'computeAlternativeRoutes': False,
    'optimizeWaypointOrder': True,
    'units': 'METRIC',
}
response = requests.post('https://routes.googleapis.com/directions/v2:computeRoutes', headers=headers, json=data, timeout=25)

我想直接使用 python 库,但是 API 的响应以 protobuff 消息的形式出现,当尝试将响应保存为 Json 时,我收到错误:

TypeError: Object of type ComputeRoutesResponse is not JSON serializable

这就是我在 python 中构建请求的方式:

routes_client = RoutesClient()
route_response = routes_client.compute_routes(
    ComputeRoutesRequest(
        destination=Waypoint(
            address=DESTINATION_PLUS_CODE
        ),
        origin=Waypoint(
            address=ORIGIN_PLUS_CODE
        ),
        intermediates=intermediates,
        travel_mode='DRIVE',
        region_code='US',
        routing_preference='TRAFFIC_AWARE',
        departure_time=datetime.now(tz=timezone('America/Los_Angeles'))+timedelta(days=1),
        compute_alternative_routes=False,
        units='METRIC',
        optimize_waypoint_order=True,
    ),
    metadata=[("x-goog-fieldmask", ','.join(field_mask))]
)

我尝试将

("content-type", 'application/json')
添加到元数据,但也不起作用。

我可以做什么来序列化结果,以便我可以保存它以供以后处理。

python google-maps google-cloud-platform google-routes-api
1个回答
0
投票

我进一步调查了。

用于 Python 使用的 Google Cloud 客户端库

proto-plus

proto-plus
包含 序列化 方法,因此您可以:

route_response = ...

ComputeRoutesResponse.to_json(route_response)

to_json
进行额外的格式化工作,但本质上是:

route_response = ...

msg = ComputeRoutesResponse.pb(route_response)
j = MessageToJson(msg)
print(j)
© www.soinside.com 2019 - 2024. All rights reserved.