json KeyError с json.loads

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

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

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

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

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

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

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

10
задан slm 29 December 2017 в 15:55
поделиться

5 ответов

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

print temp
1
ответ дан 3 December 2019 в 16:51
поделиться

Судя по опубликованному вами фрагменту, temp должен содержать только один элемент с ключом «удалить» . У вас нет ключа 'text' , поэтому я не уверен, что temp ['text'] должно искать.

2
ответ дан 3 December 2019 в 16:51
поделиться

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

'text' in temp

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

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

Я взял пример, приведенный в комментарии, и добавил к нему блок 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 ----}

Пример фрагмента №2:

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

7
ответ дан 3 December 2019 в 16:51
поделиться

Это потому, что в строке нет ключа "текст" или потому что "удалить" нет в словаре?

Это потому, что нет ключа "текст" . Если вы напечатаете 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
7
ответ дан 3 December 2019 в 16:51
поделиться

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

0
ответ дан 3 December 2019 в 16:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: