2016-08-12 5 views
-1

Хорошо, поэтому я немного боюсь, пытаясь разобрать мой объект JSON. Моя цель - захватить определенный ключ JSON и вернуть его значение.Для каждого цикла с объектом JSON python

JSON файл

{ 
    "files": { 
    "resources": [ 
     { 
     "name": "filename", 
     "hash": "0x001" 
     }, 
     { 
     "name": "filename2", 
     "hash": "0x002" 
     } 
    ] 
    } 
} 

Я разработал функцию, которая позволяет мне разобрать код JSON выше

Функции

def parsePatcher(): 
    url = '{0}/{1}'.format(downloadServer, patcherName) 
    patch = urllib2.urlopen(url) 
    data = json.loads(patch.read()) 
    patch.close() 
    return data 

Ладно, так что теперь я хотел бы для выполнения инструкции foreach, которая выводит каждое имя и хэш внутри "resources": [] объект.

Foreach заявление

for name, hash in patcher["files"]["resources"]: 
    print name 
    print hash 

Но он печатает только "имя" и "хэш" не "имя файла" и "0x001"

Я делаю что-то неправильное здесь?

+0

Обратите внимание, что JSON является формат * транспортировка *. После анализа все, что у вас есть, это объекты Python. –

ответ

3

Используя name, hash в качестве мишени в for петли, вы распаковке словаря:

>>> d = {"name": "filename", "hash": "0x001"} 
>>> name, hash = d 
>>> name 
'name' 
>>> hash 
'hash' 

Это происходит потому, что итерации по словарю производит только ключи:

>>> list(d) 
['name', 'hash'] 

и распаковка использует итерации для получения значений, назначаемых именам целей.

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

Просто используйте один имя присвоить словарю, а также использовать подписку на этот словарь:

for resource in patcher["files"]["resources"]: 
    print resource['name'] 
    print resource['hash'] 
+0

Спасибо. Это идеальное решение! :) –

-2

Проблема, кажется, у вас есть список словарей, сначала нужно получить каждый элемент списка, а затем задать элемент (который является словарем) для значений имени ключей и хэш

EDIT: это проверено и работает

mydict = {"files": { "resources": [{ "name": "filename", "hash": "0x001"},{ "name": "filename2", "hash": "0x002"}]} } 

for element in mydict["files"]["resources"]: 
    for d in element: 
    print d, element[d] 
0

Так что вы собираетесь сделать, это:

for dic in x["files"]["resources"]: 
    print dic['name'],dic['hash'] 

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

-2

Если у вас есть несколько файлов и несколько ресурсов внутри него. Это обобщенное решение работает.

for keys in patcher: 
    for indices in patcher[keys].keys(): 
      print(patcher[keys][indices]) 

Проверено выход из myside

for keys in patcher: 
...  for indices in patcher[keys].keys(): 
...    print(patcher[keys][indices]) 
... 
[{'hash': '0x001', 'name': 'filename'}, {'hash': '0x002', 'name': 'filename2'}] 
+0

OOPS !!! причина ?? я проверил с моей стороны .... –

+0

Ах, нет, это сработает, но не даст желаемого результата. OP уже зашел так далеко, у них уже есть этот список *. Вы создали сложную версию цикла 'patcher [" files "] [" resources "]' выражение без циклирования по этому списку. –

+0

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

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