2016-08-06 34 views
-1

我在閱讀python中的數據時遇到問題。行的一個的樣品是:使用Python讀取嵌套JSON列表和字典的字符串

foo_brackets='{"KEY2":[{"KEY2a":[{"KEY2a1":"4","KEY2a2":"5"},{"KEY2a1":"6","KEY2a2":"7"}],"KEY2b":"8"}],"KEY3":"9"}' 

當我與json加載,用於KEY2的值被讀出在作爲列表,因爲括號,然後阻止我在我的期望的結果,得到的該是KEY2b值:

>>> import json 
>>> foo_brackets_json=json.loads(foo_brackets) 
>>> foo_brackets_json['KEY2']['KEY2b'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers, not str 

我可以嘗試刪除括號,但實際上是應該是一個列表,KEY2a值。你可以看到這一點,如果我去掉所有的括號,並嘗試轉換成JSON:

>>> foo_no_brackets='{"KEY2":{"KEY2a":{"KEY2a1":"4","KEY2a2":"5"},{"KEY2a1":"6","KEY2a2":"7"},"KEY2b":"8"},"KEY3":"9"}' 
>>> json.loads(foo_no_brackets) 
# Traceback omitted since it's just the python error 
ValueError: Expecting property name: line 1 column 45 (char 45) 

foo_brackets確實出現了有效的JSON(我測試here,用引號去掉),並得到如下:

{ 
    "KEY2":[ 
     { 
     "KEY2a":[ 
      { 
       "KEY2a1":"4", 
       "KEY2a2":"5" 
      }, 
      { 
       "KEY2a1":"6", 
       "KEY2a2":"7" 
      } 
     ], 
     "KEY2b":"8" 
     } 
    ], 
    "KEY3":"9" 
} 

問:

有沒有辦法對我來說,閱讀對象,如foo_brackets,這樣我可以打電話foo_brackets_json['KEY2']['KEY2b']

+2

使用foo_brackets_json ['KEY2'] [0] ['KEY2b']'有什麼問題? –

+3

爲什麼你認爲這些括號是'額外的'?正如你發現的,它們是有效的JSON,它們表示一個*列表*。他們不是'額外的',除非你看起來不希望只有1個這樣的嵌套字典。 –

+0

你是對的 - 感謝您的快速反饋。這只是一種與我以前看到的不同的格式,並且被列表和字典組合所拋棄。 – Tchotchke

回答

1

foo_brackets_json['KEY2']參考a 列表,這裏有一個元素。

你將不得不使用整數索引引用包含在該列表中的字典:

foo_brackets_json['KEY2'][0]['KEY2b'] 

不要試圖取下支架;這裏可能有0個或更多的嵌套字典。你必須確定在沒有1個嵌套字典的情況下會發生什麼。

上述硬編碼引用假設列表中至少有一個這樣的字典,並且不在乎是否有多個字典。

你可以使用循環處理0以上的情況下:

for nested in foo_brackets_json['KEY2']: 
    print(nested['KEY2b']) 

現在你正在處理每個嵌套字典,一個接一個。這將適用於空列表的情況,如果有多個。

你可以製作具有0或一個以上的錯誤:

if len(foo_brackets_json['KEY2']) != 1: 
    raise ValueError('Unexpected number of results') 

等等,等等這一切都取決於你的實際使用情況。