2012-01-06 92 views
1

這個PHP代碼工作(以下JSON):如何訪問深JSON在Python屬性

$usaData = json_decode(stripslashes(file_get_contents('usaJson.txt')),true); 
foreach($usaData['USA']['States'] as $state){ 
    foreach($state['Cities'] as $city){ 
      $zipCode = $city['zipcode']; 
     } 
    } 
} 

我試圖做同樣的蟒蛇,但它給了我<type 'exceptions.TypeError'>: string indices must be integers

usaData = json.loads(get_file('usaJson.txt')) 
for state in usaData['USA']['States']: 
    for city in state['Cities']: 
     zipCode = city['zipcode'] 

我的數據結構是這樣的:

{ 
    "USA":{ 
    "States":{ 
     "AL":{ 
     "Cities":[ 
      { 
      "city":"auburn", 
      "zipcode":"36830" 
      }, 
      { 
      "city":"birmingham", 
      "zipcode":"35201" 
      } 
     ] 
     }, 
     "AK":{ 
     "Cities":[ 
      { 
      "city":"anchorage", 
      "zipcode":"99501" 
      }, 
      { 
      "city":"fairbanks", 
      "zipcode":"99701" 
      } 
     ] 
     } 
    } 
    } 
} 

那麼如何訪問python中的zipcode?

回答

0
for state in usaData.USA.States: 

,或者可能是,這取決於結構:

for state in usaData.USA.States.all(): 

編輯:不漂亮,可以使用清理,但這應該工作:

for state in usaData['USA']['States'].keys(): 
    for cities in usaData['USA']['States'][state]['Cities']: 
     print cities['zipcode'] 
+0

''字典'物體沒有屬性'USA'' 這是另一個好奇的事情。我還認爲美國和各國是屬性。 – ofko 2012-01-06 04:32:02

1

您的問題是迭代通過字典給你的關鍵,而不是在字典中的價值。所以,你需要的是這樣的:

for state_name in usaData['USA']['States'] 
    for city in usaData['USA']['States'][state_name]['Cities'] 
    print city['zipcode'] 

這是非常醜陋的

一個更好的版本是使用在字典中的items功能,它看起來像這樣:

for state_name, state in usaData['USA']['States'].items(): 
    for city in state['Cities'] 
    print city['zipcode'] 
+0

我得到了:':'list'對象沒有屬性'items'' – ofko 2012-01-06 05:20:59

+0

啊哎呀。這是因爲城市是一個清單,而不是一個字典。我會解決它。 – 2012-01-06 06:17:10