Как убрать лишнюю квадратную скобку из JSON в Python? - PullRequest
0 голосов
/ 01 июля 2011

У меня есть JSON следующей формы:

{"blah":
 [
   [
     {"first":
     {"something":"that","something":"else","another":"thing","key":"value"}...[etc.]
     }
   ]
 ]
}

, который я пытаюсь проанализировать в Python.Я импортировал json (или simplejson, в зависимости от того, какую версию Python вы используете), и все идет довольно хорошо, пока я не доберусь до этого блока:

for result in page['blah']:
  that = result['first']
  a_list.append(that)

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

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

Мой вопрос,Если предположить, что это так, то как я могу удалить его и при этом иметь действительный JSON для анализа в качестве словарей?

Другие обходные пути приветствуются.Если мне нужно предоставить больше информации, дайте мне знать.Спасибо!

(Добавил отсутствующую фигурную скобку и изменил пару непонятных терминов - я пытался придумать общие термины на лету, извините за путаницу.)

Ответы [ 3 ]

1 голос
/ 01 июля 2011

Если всегда есть только один «дополнительный» набор скобок массива:

for result in page['blah']:
    that = result[0]['this']
    list.append(that)
0 голосов
/ 02 июля 2011

Во-первых, вы правы - ваша ошибка связана с неправильным использованием типов данных Python и вывода JSON.

Во-вторых, не используйте list и все другие зарезервированные слова Python при создании переменных.

Наконец, если вы просто хотите получить все результаты для 'this' внутреннего ключа, вы можете попробовать использовать следующий код:

data = {"blah":
 [
   [
     {"first":
     {"this":"that",
     "something":"else","another":"thing","key":"value"}}
   ]
 ]
}
outres = []
for k,v in data.items():#iterate over top dictionary('blah',....)
    for sv in v: # iterate through first list
        for tv in sv: # iterate through second list
            for fk,fv in tv.iteritems(): # iterate through each dicionary from second list
                if 'this' in fv:
                    outres.append(fv['this'])
print outres

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

0 голосов
/ 01 июля 2011

Нет необходимости снимать скобки со строки JSON. Я думаю, что удаление только прав не стоит усилий. Просто найдите правильный способ доступа к нужным значениям.

«Дополнительные» скобки - не единственная проблема. this - это свойство объекта со значением first. Таким образом, чтобы получить доступ к this, вам нужно написать

that = result[0]['first']['this']

Работает ли это всегда или нет, зависит от пропущенных данных JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...