2017-02-04 4 views
0

TL; DR: Смущает вопрос о том, как проанализировать следующий ответ JSON и получить значение [статус 12345 из dynamicValue_GGG полезной нагрузки] в этом случае.Получение KeyError при разборе JSON в Python для последующего ответа

Полный вопрос: я получаю следующее как (продезинфицировать) ответ после удара REST API с помощью кода Python ниже:

response = requests.request("POST", url, data=payload, headers=headers).json()

{ 
    "payload": { 
     "name": "asdasdasdasd", 
     "dynamicValue_GGG": { 
      "12345": { 
       "model": "asad", 
       "status": "active", 
       "subModel1": { 
        "dynamicValue_67890": { 
         "model": "qwerty", 
         "status": "active" 
        }, 
       "subModel2": { 
        "dynamicValue_33445": { 
         "model": "gghjjj", 
         "status": "active" 
        }, 
       "subModel3": { 
        "dynamicValue_66778": { 
         "model": "tyutyu", 
         "status": "active" 
        }     
       } 
      } 
     }, 
     "date": "2016-02-04" 
    }, 
    "design": "asdasdWWWsaasdasQ" 
} 

Если я делаю type(response['payload']), это дает мне 'dict'.

Теперь я пытаюсь разобрать ответ выше и извлечь из него определенные ключи и значения. Проблема в том, что я не могу выполнять итерацию с помощью «индекса» и, скорее, должен указывать «ключ», но тогда ответ имеет определенные «ключи», которые динамически генерируются и отправляются. Например, клавиши «dynamicValue_GGG», «dynamicValue_66778» и т. Д. Не являются статическими, в отличие от клавиши «status».

Я могу успешно разобрать, упоминая, как:

print response['payload']['dynamicValue_GGG']['12345'][status] 

в этом случае я получаю ожидаемый выход = «active».

Однако, так как я не имею никакого контроля на «dynamicValue_GGG», он будет работать только тогда, когда я могу указать что-то вроде этого, вместо:

print response['payload'][0][0][status] 

Но выше линия дает мне сообщение об ошибке: «KeyError: 0», когда питон код выполнен.

Есть ли какой-то способ, в котором я могу использовать силу обоих ключей, а также индекс вместе в этом случае?

+1

Знаете ли вы что-нибудь о динамическом диапазоне? Всегда ли это начинается с "dynamicValue_"? – Barmar

+0

Вы можете перебирать ключи и значения словаря, пока не получите ключ, соответствующий шаблону динамических клавиш. – Barmar

+0

Не следует ли указывать 'status' в' ['status'] '? – Barmar

ответ

2

Порядок значений в словаре в Python случайный, поэтому вы не можете использовать индексацию. Вам придется перебирать все элементы, потенциально рекурсивные, и тестировать, чтобы убедиться, что это то, что вы ищете. Например:

def find_submodels(your_dict): 
    for item_key, item_values in your_dict.items(): 
    if 'status' in item_values: 
     print item_key, item_values['status'] 

    if type(item_values) == dict: 
     find_submodels(item_values) 

find_submodels(your_dict) 

Какой бы выход:

12345 active 
dynamicValue_67890 active 
dynamicValue_66778 active 
dynamicValue_33445 active 
+0

'status' находится на 2 уровнях от динамического значения. Это должно быть 'if 'status' в item_values ​​['12345']:' – Barmar

+1

Кроме того, вы должны проверить, является ли 'item_values' тиком, прежде чем использовать' if 'status' в item_values: '. Вы не хотите делать это на элементах 'name' и' date', так как их значения являются строками. – Barmar

+1

Этот код, очевидно, не является доказательством дурака. Это просто демонстрация того, как итерации через динамические иерархические данные. Опубликованные данные OP не являются даже допустимыми Python, поэтому в его реальной проблеме, вероятно, будет отличаться. –

Смежные вопросы