2014-01-24 2 views
0

Я создаю приложение, использующее python. Я делаю HTTP-запрос и получаю следующий результат:FOR loop in object/array

{ 
    "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-string для объекта 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

Его лучше использовать tuple вместо списка – KiraLT

+0

@Lukas: Почему? –

+2

Tuple быстрее, чем список. Также ответ сервера не изменчив, поэтому его лучшая логика не позволяет его изменить. – 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'? –