在Python中从JSON中提取值

时间:2016-11-24 13:56:01

标签: python json

这是来自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'元素'

2 个答案:

答案 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}

请注意:

  • str(json_object)用单引号包装字符串,这是无效的JSON。
  • 因此,如果您有一个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