2013-08-13 2 views
0

у меня есть следующие JSONНевозможно вывести данные из JSON с помощью питона

{ 
    "response": { 
     "message": null, 
     "exception": null, 
     "context": [ 
      { 
       "headers": null, 
       "name": "aname", 
       "children": [ 
        { 
         "type": "cluster-connectivity", 
         "name": "cluster-connectivity" 
        }, 
        { 
         "type": "consistency-groups", 
         "name": "consistency-groups" 
        }, 
        { 
         "type": "devices", 
         "name": "devices" 
        }, 
        { 
         "type": "exports", 
         "name": "exports" 
        }, 
        { 
         "type": "storage-elements", 
         "name": "storage-elements" 
        }, 
        { 
         "type": "system-volumes", 
         "name": "system-volumes" 
        }, 
        { 
         "type": "uninterruptible-power-supplies", 
         "name": "uninterruptible-power-supplies" 
        }, 
        { 
         "type": "virtual-volumes", 
         "name": "virtual-volumes" 
        } 
       ], 
       "parent": "/clusters", 
       "attributes": [ 
        { 
         "value": "true", 
         "name": "allow-auto-join" 
        }, 
        { 
         "value": "0", 
         "name": "auto-expel-count" 
        }, 
        { 
         "value": "0", 
         "name": "auto-expel-period" 
        }, 
        { 
         "value": "0", 
         "name": "auto-join-delay" 
        }, 
        { 
         "value": "1", 
         "name": "cluster-id" 
        }, 
        { 
         "value": "true", 
         "name": "connected" 
        }, 
        { 
         "value": "synchronous", 
         "name": "default-cache-mode" 
        }, 
        { 
         "value": "true", 
         "name": "default-caw-template" 
        }, 
        { 
         "value": "blah", 
         "name": "default-director" 
        }, 
        { 
         "value": [ 
          "blah", 
          "blah" 
         ], 
         "name": "director-names" 
        }, 
        { 
         "value": [ 

         ], 
         "name": "health-indications" 
        }, 
        { 
         "value": "ok", 
         "name": "health-state" 
        }, 
        { 
         "value": "1", 
         "name": "island-id" 
        }, 
        { 
         "value": "blah", 
         "name": "name" 
        }, 
        { 
         "value": "ok", 
         "name": "operational-status" 
        }, 
        { 
         "value": [ 

         ], 
         "name": "transition-indications" 
        }, 
        { 
         "value": [ 

         ], 
         "name": "transition-progress" 
        } 
       ], 
       "type": "cluster" 
      } 
     ], 
     "custom-data": null 
    } 
} 

, которые им пытаются анализировать, используя модуль JSON в Python. Меня интересует только следующая информация.

Название Значение оперативно-статус Значение медицинского состояния Значение

Вот что я попробовал. в данных ниже сценария является JSON вернулся с веб-страницы

json = json.loads(data) 
healthstate= json['response']['context']['operational-status'] 
operationalstatus = json['response']['context']['health-status'] 

К сожалению, я думаю, что я должен быть что-то, что и выше результатов отсутствует ошибкой, индексы должны быть целыми числами не строка.

если я пытаюсь

healthstate= json['response'][0] 

ошибки Это, говоря индекс 0 находится вне диапазона.

Любая помощь будет с благодарностью принята.

+4

«контекст» является список, не ДИКТ. – mccakici

+1

Внутри структуры отсутствует ключ «состояние работоспособности», только «состояние работоспособности», в глубоко вложенном объекте. –

+0

xcoder, спасибо не знаю, как я этого не заметил: D Martijn Pieters, thats тип пропусков с моей стороны. благодаря – Steve

ответ

1

Вы должны следовать структуре данных. Лучше всего интерактивно манипулировать данными и проверять, что такое каждый элемент. Если это список, вам придется индексировать его по-своему или перебирать его и проверять значения. Если это диктофон, вам придется индексировать его своими ключами. Например, вот функция, которая получает контекст, а затем выполняет итерации через атрибуты, проверяющие конкретное имя.

def get_attribute(data, attribute): 
    for attrib in data['response']['context'][0]['attributes']: 
     if attrib['name'] == attribute: 
      return attrib['value'] 
    return 'Not Found' 

>>> data = json.loads(s) 
>>> get_attribute(data, 'operational-status') 
u'ok' 
>>> get_attribute(data, 'health-state') 
u'ok' 
3

json['response']['context'] - это список, поэтому что объект требует использования целочисленных индексов.

Каждый элемент в этом списке сам по себе является словарем. В этом случае только один такой пункт.

Чтобы получить все "name": "health-state" словарей из этой структуры вы должны сделать немного больше обработки:

[attr['value'] for attr in json['response']['context'][0]['attributes'] if attr['name'] == 'health-state'] 

даст вам список совпадающих значений health-state в первого контекста.

Демо:

>>> [attr['value'] for attr in json['response']['context'][0]['attributes'] if attr['name'] == 'health-state'] 
[u'ok'] 
1

json['reponse']['context'] является list, не dict. Структура не совсем то, что вы думаете.

К примеру, только «рабочее состояние» Я вижу, там можно прочитать следующим:

json['response']['context'][0]['attributes'][0]['operational-status'] 
Смежные вопросы