2015-03-25 3 views
0

Я загрузил файл JSON, но я не могу его разобрать, чтобы обновить или вставить значения.ошибка в json python parsing

JSON структура похожа на это:

{ 
    "nodes": [ 
     { 
      "id": "node1", 
      "x": 21.0, 
      "y": 8.0 
     }, 
     { 
      "id": "node5", 
      "x": 3.0, 
      "y": 5.0 
     } 
    ] 
} 

Хотя мой питон код для извлечения узла похож на это:

jsonData = defaultdict(list) 
with open('data.json', 'r') as f: 
    jsonData = json.load(f) 
print jsonData['nodes']['id'] == 'node5' 

Ошибки я получаю «Ошибка типа: список индексов должны быть целыми, а не str ".

Как получить узел и как его можно обновить?

+0

Кстати, у вас JSON сломан, третий из последней строки имеет '' 'aft er '' ', которого не должно быть. – Joseph

+0

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

ответ

1

В вашем JSON nodes - это список объектов, поэтому вы не можете пытаться получить доступ к элементам внутри него, используя строку, как вы делаете, с 'id'.

Вместо этого, вы можете перемещаться по нему:

with open('data.json', 'r') as f: 
    jsonData = json.load(f) 

for item in jsonData['nodes']: 
    print item['id'], item['x'], item['y'] 

[Редактировать] Для решения комментарий:

with open('data.json', 'r') as f: 
    jsonData = json.load(f) 

jsonData['nodes'] = {e['id']: e for e in jsonData['nodes']} 
jsonData['nodes']['node5']['z'] = 12 
+0

спасибо Джозефу, но таким образом, как я могу добавить новое значение для старого узла? (Скажите ... Мне нужно добавить «z» = 12 в узел с id = 'node5'.) –

+0

Если у вас нет никакого контроля над JSON, который вы читаете, у вас есть два варианта: один, итерации по всем 'json ['nodes']' и внутри цикла, проверьте, является ли текущий элемент тем, который вы хотите изменить. Или, еще лучше, просто превратите 'jsonData ['nodes']' в сам dict, основываясь на его содержимом, например 'jsonData ['nodes'] = {e ['id']: e для e в jsonData ['nodes' ]} ' – Joseph

+0

Спасибо, Джозеф. Я попробую. –

0

Этот фрагмент кода добавляет аа новое значение (г = 12) к старому узлу и обновляет существующий узел y

import json 
from collections import defaultdict 

jsonData = defaultdict(list) 
with open('c:/temp/data.json', 'r') as f: 
    jsonData = json.load(f) 
for item in jsonData['nodes']: 
    if item['id']=='node5': 
     item['y'] = 5 
     item['z'] = 12