2016-11-24 91 views
2

這是Google距離矩陣的回覆。我想只有兩個值作爲輸出,我試圖用Python來提取它。從Python中提取JSON的值

{ 
    "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異常 '元素'

+1

我沒有看到你在代碼中使用'json.loads'。請說明你是如何嘗試使用它的,它是如何工作的(例如:錯誤信息,錯誤的輸出,...) – UnholySheep

+0

增加了json.loads。試圖打印它,看看它是否有效,但沒有。給我一個KeyError'元素' – Donald

+1

,因爲你必須指定的第一個鍵是「rows」,也是「rows」和「elements」是數組,所以你需要指定你需要的元素 - 所以它應該是'print jdata ['rows'] [0] ['elements'] [0] ['distance'] ['value']' – UnholySheep

回答

4

json.loads將一個字符串paramater。負載中的's'是字符串。

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。
  • 所以,如果你有你一直在使用STR(更早轉換成字符串JSON對象),現在要將其轉換回JSON,那麼你可以解決這樣的:

    json.loads(json.dumps(str(json_object))) 
    
+0

謝謝,它的工作原理! :-) – Donald

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

+0

任何好的json解析器都可以處理換行符。如果它不能解析,則不能訪問數據 – UnholySheep