2016-03-10 79 views
2

我試圖用Python解釋來自Twitch API的數據。這是我的代碼:與Python的JSON「對象必須是str,而不是字典」

from twitch.api import v3 
import json 

streams = v3.streams.all(limit=1) 
list = json.loads(streams) 
print(list) 

然後,運行的時候,我得到:

類型錯誤 「的JSON對象必須str的,而不是 '字典'」

任何想法?另外,這是一種我真的想要使用API​​中的數據的方法嗎?

+0

嘗試打印'streams'。它可能已經被解析過JSON。 –

+2

另外:不應該使用'list'(或任何其他內置函數的名稱)作爲變量名稱。後續代碼不能再調用'list()'並期待標準結果。 –

+0

@DanD。啊是的,所以印刷流確實有效。現在,我將如何處理這些數據的一部分並使用它? – Karrigan

回答

1

根據documentationjson.loads()將一個字符串解析爲json層次結構(通常是dict)。因此,如果你不傳遞一個字符串,它將會失敗。

json.loads(S,編碼=無,CLS =無,object_hook =無, parse_float =無,parse_int =無,parse_constant =無, object_pairs_hook =無,**千瓦)反序列化S(一str實例包含 JSON文檔)使用此轉換表格到Python對象。

其他參數與load()中的含義相同,但 編碼將被忽略和棄用。

如果被反序列化的數據不是有效的JSON文檔,則會引發一個 JSONDecodeError。

從我們看到,all()返回的對象Twitch APIV3Query。看看這個sourcedocumentation,我們看到它是爲了返回一個列表。因此,您應該將其視爲列表而不是需要解碼的字符串。

具體地說,V3QueryApiQuery一個子類,反過來的JsonQuery一個子類。該類顯式運行查詢並將結果傳遞給get_json。該來源明確呼籲json.loads() ...所以你不需要!請記住:永遠不要害怕挖掘源頭。

+2

這只是說它失敗了,因爲它失敗了。事實上,api已經在進行解碼,所以你不必再做一次。 – tdelaney

+0

不,那是因爲傳遞給函數的類型不正確而失敗。這是引用錯誤的原因。 –

+0

OP的問題是他沒有意識到JSON已經被解碼爲python。 – tdelaney

0

流後= v3.streams.all(極限= 1) 嘗試使用 流= json.dumps(流)

作爲流應該是一個JSON字符串和在形式: 「{ 「key」:value}' 而不僅僅是字典格式: {「key」:value}

相關問題