这是来自Google Distance Matrix的回复。我想只有两个值作为输出,我试图用Python提取它。
{
"destination_addresses" : [ "Hoorn, Nederland" ],
"origin_addresses" : [ "Amsterdam, Nederland" ],
"rows" : [
{
"elements" : [
{
"distance" : {
"text" : "45,0 km",
"value" : 44952
},
"duration" : {
"text" : "40 min.",
"value" : 2423
},
"status" : "OK"
}
]
}
],
"status" : "OK"
}
这是我迄今为止所尝试过的。我希望每隔15分钟收到Google的回复并将其写入文件。但在文件中我只想要距离和持续时间的值,我没有运气实现这一点。我不确定Google的回复是否是正确的JSON,所以我尝试了json.loads,但它不允许我从回复中提取某些部分。有什么想法吗?
import requests
import json
import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
uri = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=Amsterdam&destinations=Hoorn&mode=driving&key="
now = datetime.datetime.now()
def job():
datum = now.strftime("%Y-%m-%d %H:%M")
print datum
text_file = open('tijdsduur.txt', 'a')
batch = requests.get(uri)
data = batch.text
jdata = json.loads(data)
print jdata['elements']['distance']['value']
text_file.write(data)
text_file.write('\n')
text_file.close()
job()
scheduler = BlockingScheduler()
scheduler.add_job(job, 'interval', minutes=15)
scheduler.start()
尝试json.loads时出错:KeyError'元素'
答案 0 :(得分:4)
json.loads将采用字符串参数。 ''在负载中是为了字符串。
import json
a="""{
"destination_addresses" : [ "Hoorn, Nederland" ],
"origin_addresses" : [ "Amsterdam, Nederland" ],
"rows" : [
{
"elements" : [
{
"distance" : {
"text" : "45,0 km",
"value" : 44952
},
"duration" : {
"text" : "40 min.",
"value" : 2423
},
"status" : "OK"
}
]
}
],
"status" : "OK"
}"""
b = json.loads(a)
dist,dur = b['rows'][0]['elements'][0]['distance'], b['rows'][0]['elements'][0]['duration']
print dist
print dur
输出:
{u'text': u'40 min.', u'value': 2423}
{u'text': u'45,0 km', u'value': 44952}
请注意:
因此,如果您有一个json对象,您之前使用str()将其转换为字符串,现在您想将其转换回JSON,那么您可以像这样解决:
json.loads(json.dumps(str(json_object)))
答案 1 :(得分:0)
我认为你的问题是因为\ n字符。尝试删除它并使用json.loads将批处理中的响应提取为json。 以下是我从谷歌获得的回复:
u'{\n "destination_addresses" : [ "Hoorn, Netherlands" ],\n "origin_addresses" : [ "Amsterdam, Netherlands" ],\n "rows" : [\n {\n "elements" : [\n {\n "distance" : {\n "text" : "45.0 km",\n "value" : 44952\n },\n "duration" : {\n "text" : "40 mins",\n "value" : 2423\n },\n "status" : "OK"\n }\n ]\n }\n ],\n "status" : "OK"\n}\n'
batch.replace("\n", "")
jsonData = json.loads(batch)
现在你有jsonData作为JSON