2012-05-04 71 views
0

我使用的是根據輸入給出json不同結構的Yahoo Placemaker API。 簡單的JSON文件是這樣的:在Python中解析具有可變結構的json文件

{ 
    'document':{ 
     'itemDetails':{ 
      'id'='0' 
      'prop1':'1', 
      'prop2':'2' 
     } 
     'other':{ 
      'propA':'A', 
      'propB':'B' 
     } 
    } 
} 

當我想訪問itemDetails我只是寫json_file [ '文件'] [ 'itemDetails']。

但是,當我變得更加複雜的反應,如

{ 
    'document':{ 
     '1':{ 
     'itemDetails':{ 
      'id'='1' 
      'prop1':'1', 
      'prop2':'2' 
     } 
     }, 
     '0':{ 
     'itemDetails':{ 
      'id'='0' 
      'prop1':'1', 
      'prop2':'2' 
     }, 
     '2':{ 
     'itemDetails':{ 
      'id'='1' 
      'prop1':'1', 
      'prop2':'2' 
     } 
     'other':{ 
      'propA':'A', 
      'propB':'B' 
     } 
    } 
} 

的解決方案顯然是行不通的。

我使用id,prop1和prop2來創建對象。

在沒有寫json_file ['document'] ['0'] ['itemDetails']?的情況下自動訪問第二種情況下itemDetails的最佳方法是什麼?

+0

'json_file ['document'] ['0'] ['itemDetails']''有什麼問題?你想要使用相同的代碼來處理這兩種情況? – yak

回答

1

如果我理解正確的話,你想通過所有的json_file['document']['0']['itemDetails']json_file['document']['1']['itemDetails']環路,...

如果是這樣的話,那麼:

item_details = {} 
for key, value in json_file['document']: 
    item_details[key] = value['itemDetails'] 

或者,一個班輪:

item_details = {k: v['itemDetails'] for k, v in json_file['document']}

然後您就可以訪問他們作爲item_details['0']item_details['1'],...

注意:您可以使用int(key)int(k)來抑制0和1附近的單引號。

編輯: 如果要無縫地訪問這兩種情況(是否有一個結果或多個),你可以檢查:

if 'itemDetails' in json_file['document']: 
    item_details = {'0': json_file['document']['itemDetails']} 
else: 
    item_details = {k: v['itemDetails'] for k, v in json_file['document'] if k != 'other'} 

通過item_details字典然後循環。