2016-01-06 98 views
0

我99%確定這已經被回答了,但我是一個認真的新手,需要你的友善。在python中獲取JSON嵌套值

下面是JSON我通過一個API調用

{ 
name: "dt_listings", 
count: 10, 
results: { 
collection1: [ 
    { 
    title: { 
    text: "Human Anatomy and Physiology 10th", 
    href: "http://www.directtextbook.com/isbn/9780321927040" 
    }, 
    isbn: { 
    text: "9780321927040", 
    href: "http://www.directtextbook.com/isbn/9780321927040" 
    } 
} ] 

import requests 
import json 
dt_raw = requests.get(dt_listings_url) 
dt_json = dt_raw.json() 

在此之後得到的,是我的問題開始。我似乎無法轉到['results'],然後轉到['collection1'],然後是['title']以獲取['title'] ['text']的值,['isbn'] [''文字']

大的請求,如果你使用代碼示例來幫助,請使用上面的對象的名稱,以便我可以遵循(我在這裏有一個嚴重的腦凍結!)。是的,我已閱讀了許多相關的stackoverflow帖子,我仍然很難與此。

+0

也許您需要使用'json.loads'將返回的JSON字符串轉換爲字典並訪問它的字段? – ZdaR

+0

正確的JSON應該在雙引號中有鍵。 「name」:「dt_listings」 –

+0

你忘了關閉'collection1',你用'['打開了它,但沒有用']關閉'''這不是一個有效的JSON。另外,還有2個'}'錯過了 – Danh

回答

0
  1. 可以使用:

    dt_json [ 「結果」] [ 「collection1」] [0] [ 「標題」] [ 「文本」]

  2. 有一個右方括號缺少(「]」),可能在最後一個關閉花括號之前。這使得dt_json [「results」] [「collection1」]的值應該被一個整數索引。

+0

1']'和2'}'錯過了。 – Danh

+0

我認爲這不起作用,如果鑰匙沒有報價。我沒有注意到,現在想知道爲什麼源代碼(不在我的控制下)以這種方式格式化數據 –

0

首先字典無效。 應在雙引號

, 你必須檢查響應您通過API得到的類型。

假設您的答案爲dt_json。使用type(dt_json)檢查它的類型。

如果是 「海峽」 那麼你必須負載dt_json使用json.loads(dt_json),然後你可以prase容易吧..

+0

我的調試器告訴我,dt_json是一個字典。接下來是什麼? :( –

+0

現在我想問問kimonolabs,這是我創建api的地方,是返回一個字典 –

+0

@BruceBookman:只需驗證你的字典響應[這裏](json.parser.online.fr)。如果它字典,那麼你可以很容易地做到迭代它,請用正確的字典更新你的問題,我可以通過它解決你的問題 – iNikkz

0
{ 
    "name": "dt_listings", 
    "count": 10, 
    "results": { 
    "collection1": [ 
     { 
     "title": { 
      "text": "Human Anatomy and Physiology 10th", 
      "href": "http://www.directtextbook.com/isbn/9780321927040" 
     }, 
     "isbn": { 
      "text": "9780321927040", 
      "href": "http://www.directtextbook.com/isbn/9780321927040" 
     } 
     } 
    ] 
    } 
} 

我猜你的數據應該像上面那樣。在你的json數據中有一些語法錯誤。

如果這是真的:

import json 

your_data = "{\n\"name\": \"dt_listings\",\n\"count\": 10,\n\"results\": {\n\"collection1\": [\n{\n \"title\": {\n \"text\": \"Human Anatomy and Physiology 10th\",\n \"href\": \"http://www.directtextbook.com/isbn/9780321927040\"\n },\n \"isbn\": {\n \"text\": \"9780321927040\",\n \"href\": \"http://www.directtextbook.com/isbn/9780321927040\"\n }\n }\n ]\n} \n}\n" 

structured_data = json.loads(your_data) 

# then get the result: 

print structured_data['results']['collection1'][0]['isbn'] 
+0

不幸的是,這是數據如何到達我:(不是我的數據格式化,但我認爲我已經能夠強制它的格式與你在your_data中的格式一樣 –

3

檢查JSON,它有三件事情錯

  1. 鍵和值應在雙引號
  2. 對於集合重點關閉brakect]缺失。
  3. 此外,它缺少兩個關閉籃球}

這是你的正確的JSON

{ 
    "name": "dt_listings", 
    "count": 10, 
    "results": { 
    "collection1": [ 
     { 
     "title": { 
     "text": "Human Anatomy and Physiology 10th", 
     "href": "http://www.directtextbook.com/isbn/9780321927040" 
     }, 
     "isbn": { 
     "text": "9780321927040", 
     "href": "http://www.directtextbook.com/isbn/9780321927040" 
     } 
     } 
    ] 
    } 
    } 

如果你的JSON是在正確的格式,請使用 型(dt_json)

如果類型爲海峽您的JSON的類型, do json.loads(dt_json)然後嘗試dt_json [「results」] [「collection1」] [0] [「title」] [「text」]

如果類型是字典,然後直接嘗試dt_json [ 「成果」] [ 「collection1」] [0] [ 「標題」] [ 「文字」]

+0

OP正在使用請求庫,所以'dt_raw.json()'會自動解析JSON響應並返回一個字典而不是字符串,因此不需要檢查類型然後調用' json.loads'。如果響應內容無效,'dt_raw.json()'會引發'ValueError',所以如果OP越過這條線,那麼他可能會得到有效的JSON。 –

+0

這有助於一些。上面的JSON正確關閉,我只是沒有複製/粘貼。不過,我認爲你正在檢查類型。 –

+0

Muhammand - 你100%正確。它正在返回一個字典。一秒鐘之後嘗試上面的字典建議 –

0

每個人都超級有幫助的。關鍵問題是,dt_json是類型字典。所以下面的代碼完美地工作。

dt_raw = requests.get(dt_listings_url) 
dt_json = dt_raw.json() 
print dt_json["results"]["collection1"][0]["isbn"]["text"]