2010-04-27 102 views
1

我正在從jython中導入/解析JSON創建的字典。「str索引必須是整數」是什麼意思?

TypeError: str indices must be integers 

這時候我做這樣的事情發生:某些章節我看到下面的消息,工作

if jsondata['foo']['bar'].lower() == 'baz': 
    ... 

jsondata樣子:

{'foo': {'bar':'baz'} } 

這是什麼意思,和我如何解決它?

+2

你確定你實際上已經解碼的JSON字符串Python類型? – 2010-04-27 10:24:31

+1

if jsondata ['foo'] ['bar']。lower()=='baz':? 它看起來像你正在將「baz」分配給lower()函數... – Powertieke 2010-04-27 10:24:42

+0

你應該'打印repr(jsondata)'以確保它確實是你期望的'dict',而不是你實際擁有的'str' (查看答案。) – 2010-04-27 10:33:43

回答

2

在從字典中獲取數據之前,您需要在字典中檢查字典和字符串'z'的類型。

>>> jsondata = {'a': '', 'b': {'z': True} } 
>>> for key in jsondata: 
...  if type(jsondata[key]) is dict and 'z' in jsondata[key].keys() and jsondata[key]['z'] is True: 
...   print 'yes' 
... 
yes 
>>> 

或較短的一個與dict.get

>>> jsondata = {'a': '', 'b': {'z': True}, 'c' :{'zz':True}} 
>>> for key in jsondata: 
...  if type(jsondata[key]) is dict and jsondata[key].get('z',False): 
...   print 'yes' 
... 
yes 
>>> 
1

其實你的陳述應該提高SyntaxError: can't assign to function call,因爲你錯過了=,因此做了一個任務而不是平等檢查。

因爲我在運行你所顯示的代碼時沒有得到TypeError,所以我想你首先修復了丟失的=,之後再檢查一下Stacktrace的說法。

但是它也可能是你的jsondata沒有被解碼,因此仍然是純文本,這當然會提高索引錯誤。

+0

對不起,修復了錯字 – 2010-04-27 10:30:06

3

正如Marcelo和Ivo所說,這聽起來像是在嘗試訪問原始JSON字符串,而沒有先通過json.loads(my_json_string)將其解析爲Python。

+0

Yupp。試圖訪問JSON作爲str ...他們爲什麼不在學校教C#? – 2014-09-29 12:56:18

相關問題