2014-01-24 53 views
0

我正在使用python創建一個應用程序。我發出一個HTTP請求並得到如下結果:對象/數組中的循環

{ 
    "companies": { 
     "company": [ 
      { 
       "createDt": "2014-01-18T00:00:00+01:00", 
       "dbNazev": "sveatlo_s_r_o_", 
       "id": "1", 
       "licenseGroup": "null", 
       "nazev": "Sveatlo s.r.o.", 
       "show": "true", 
       "stavEnum": "ESTABLISHED", 
       "watchingChanges": "false" 
      }, 
      { 
       "createDt": "2014-01-20T00:00:00+01:00", 
       "dbNazev": "hajocka", 
       "id": "2", 
       "licenseGroup": "null", 
       "nazev": "HájoÄka", 
       "show": "true", 
       "stavEnum": "ESTABLISHED", 
       "watchingChanges": "false" 
      } 
     ] 
    } 
} 

然後我正在處理for循環中的數據。問題是,響應也可能是這樣的:

{ 
    "companies": { 
     "company": { 
      "createDt": "2014-01-18T00:00:00+01:00", 
      "dbNazev": "sveatlo_s_r_o_", 
      "id": "1", 
      "licenseGroup": "null", 
      "nazev": "Sveatlo s.r.o.", 
      "show": "true", 
      "stavEnum": "ESTABLISHED", 
      "watchingChanges": "false" 
     } 
    } 
} 

目前我檢查,如果它是一個數組或沒有這樣每個請求後,但我覺得這不是做到這一點的最好辦法。任何人都可以幫助我找到更好的解決方案嗎?

感謝您的任何答案。

編輯:我不能改變服務器的響應

+0

將是有益的張貼與您訪問JSON的代碼。 –

+0

你使用的是json模塊嗎? – PierrOz

+0

我使用的是ujson,但是通過請求模塊內置功能創建JSON字符串到python對象 – sveatlo

回答

5

歸你解析信息。這將阻止您不必重複自己:

假設你有數據,既可以是這樣的:

some_json_data = {"companies": {"foo": 1}} 

或像這樣:

some_json_data = {"companies": [{"foo": 1}]} 

所以,當你解析JSON數據,這樣做:

i_expect_an_array = some_json_data['companies'] 
if not isinstance(i_expect_an_array, list): 
    i_expect_an_array = (i_expect_an_array,) 

# Now, you can process the data as you normally would 

不需要兩個單獨的類似代碼塊。

+0

它更好的使用元組而不是列表 – KiraLT

+0

@Lukas:爲什麼? –

+2

元組比列表快。服務器響應也是不可改變的事情,所以它更好的邏輯不允許改變它。 – KiraLT

2

轉換不會列出列表或序列,然後循環:

def make_list(item): 
    if not isinstance(item, (list, tuple)): 
     return [item] 
    return list(item) 

for company in make_list(data['companies']['company']): 
    process_company(company) 
+2

不應該將'make_list'命名爲'make_tuple'? –