json KeyError с json.loads - PullRequest
       5

json KeyError с json.loads

8 голосов
/ 22 апреля 2010

JSON, похоже, икотает на следующие утверждения:

{"delete":{"status":{"id":12600579001,"user_id":55389449}}}

фрагмент кода:

temp = json.loads(line)
text = temp['text']

Я получаю следующее сообщение об ошибке, когда в приведенном фрагменте кода встречаются строки, похожие на приведенный выше JSON-словарь:

text = temp['text']
KeyError: 'text'

Это потому, что в строке нет «текстового» ключа или «удаления» нет в словаре?

Ответы [ 9 ]

7 голосов
/ 23 апреля 2010

Это потому, что в строке нет «текстового» ключа или «удаления» нет в словаре?

Это потому, что нет "текстового" ключа. Если вы print temp или проверите, есть ли ключ 'text' в результирующем словаре Python, вы заметите, что нет ключа с именем 'text'. На самом деле, temp имеет только один ключ: 'delete'. Словарь, на который ссылается 'delete', содержит один ключ 'status', который содержит другой словарь с двумя ключами: 'user_id' и 'id'.

Другими словами, ваша структура такова:

{
    "delete" : {
        "status" : {
            "id" : 12600579001,
            "user_id" : 55389449
        }
    }
}

Как видите, нигде нет "текстового" ключа.

Кроме того, вы можете проверить это сами:

>>> 'text' in temp
False
>>> 'delete' in temp
True
5 голосов
/ 22 апреля 2010

Похоже, это происходит потому, что там нет текста.Возможно, вы могли бы использовать что-то вроде

'text' in temp

, чтобы проверить, что текст существует, прежде чем пытаться его использовать.

Редактировать:

I 'Мы взяли пример, приведенный в комментарии, и добавили в него блок if / elif / else.

#! /usr/bin/python
import sys
import json
f = open(sys.argv[1])
for line in f:
    j = json.loads(line)
    try:
        if 'text' in j:
            print 'TEXT: ', j['text']
        elif 'delete' in j:
            print 'DELETE: ', j['delete']
        else:
            print 'Everything: ', j
    except: 
        print "EXCEPTION: ", j

Пример блока № 1:

{u'favorited ': False, u'contributors ': None, u'truncated': False, u'text ': ---- snip ----}

Образец Chunk # 2:

{u'delete ': {u'status': {u'user_id ': 55389449, u'id': 12600579001L}}}}

2 голосов
/ 12 июня 2013

Попробуйте, чтобы увидеть проблему в деталях:

import json
line = '{"delete":{"status":{"id":12600579001,"user_id":55389449}}}'
print 'line:', line
temp = json.loads(line)
print 'temp:', json.dumps(temp, indent=4)
print 'keys in temp:', temp.keys()

, которая генерирует этот вывод:

line: {"delete":{"status":{"id":12600579001,"user_id":55389449}}}
temp: {
    "delete": {
        "status": {
            "user_id": 55389449, 
            "id": 12600579001
        }
    }
}
keys in temp: [u'delete']

Единственный ключ в temp диктовке - «удалить».Таким образом, temp['text'] генерирует KeyError.

2 голосов
/ 22 апреля 2010

Из фрагмента, который вы разместили, похоже, что temp должен иметь только один элемент с ключом "delete". У вас нет ключа 'text', поэтому я не уверен, что temp['text'] должно искать.

1 голос
/ 09 апреля 2019

используйте dict.get (ключ [, по умолчанию]) , если существует действительный случай, когда ключ отсутствует: temp.get('text') вместо temp['text'] Не выдает исключение, а возвращает Null, если ключ не найден.

EAFP (Проще просить прощения, чем разрешения) более питон, чем LBYL (смотри, прежде чем прыгнуть).

1 голос
/ 14 мая 2013

попробуйте так:

    temp = json.load(line)
    for lines in temp
       text = lines['text']
1 голос
/ 22 апреля 2010

Почему бы не поместить это между первой и второй строками:

print temp
0 голосов
/ 20 июля 2016
#!/usr/bin/env python
import sys
import json
from pprint import pprint


json_file=sys.argv[1]
json_data=open(json_file)
j = json.load(json_data)

def main():
  for attribute_key in j['root_attribute']:
   try: print attribute_key['name'], attribute_key['status'], attribute_key['text']
   except KeyError: pass

if __name__ == "__main__":
    main()
0 голосов
/ 29 апреля 2010

Спасибо всем за предложения. Суть проблемы заключалась в том, что в формате Twitter JSON есть словарь в словаре. Решение включает двойной индекс, чтобы получить переменные, которые мне нужно проверить.

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