Чтение значений из файла Json

Я пытаюсь прочитать атрибут из файла Json, используя это: d['text']['entities']['mention'][0]['screen_name']

JSON-файл

{
    "text" : {
        "content" : "@narendramodi Did u even know the fare of metro has been increased by 65%",

        "entities" : {
            "user_mentions" : [ ],
            "mention" : [
                {
                    "indices" : [
                        0,
                        13
                    ],
                    "id_str" : "18839785",
                    "screen_name" : "narendramodi",
                    "name" : "Narendra Modi",
                    "id" : 18839785
                }
            ],
            "hashtags" : [ ],
        },

    }
}

Я пытаюсь загрузить много файлов json в базу данных Neo4J, используя библиотеку py2neo.

При доступе к d['text']['entities']['mention'][0]['screen_name'] в одном из файлов json, в котором поле упоминания "mention" : [ ], пусто, он говорит

IndexError: индекс списка вне допустимого диапазона

Ошибка довольно очевидна, но как мне с этим справиться?


person Aman Kumar    schedule 05.06.2017    source источник
comment
Он отлично работает на моем компьютере (python 3.6), значение 'narendramodi' без проблем.   -  person Ender Look    schedule 05.06.2017
comment
Он отлично работает и для меня. Это все, что у вас есть в файле JSON? Я использую Python 2.7..   -  person Sagar Waghmode    schedule 05.06.2017
comment
Кажется, существует несоответствие между опубликованным вами json и json, который читает ваша программа.   -  person cs95    schedule 05.06.2017
comment
Просто узнал настоящую проблему. Пожалуйста, посмотрите отредактированную версию задачи.   -  person Aman Kumar    schedule 05.06.2017


Ответы (2)


Вы можете просто использовать блок try/except. Нравиться

try:
  data = d['text']['entities']['mention'][0]['screen_name']
  ...
except IndexError:
  data = None # or handle this case in other way
person kvorobiev    schedule 05.06.2017
comment
@Aman Kumar Добро пожаловать) Если мой ответ полезен, вы можете отметить его как правильный ответ. - person kvorobiev; 05.06.2017

попробуй это -

   mentions = d.get('text',{}).get('entities',{}).get('mention' ,[])
   if len(mentions)>0:
        print(mentions[0].get('screen_name',None))
   else:
        print(None)
person tom    schedule 05.06.2017
comment
строка не будет производить IndexError: list index out of range. Кроме того, вы не конвертируете его в объект json, а в объекты python. JSON — это формат сериализации текста. - person juanpa.arrivillaga; 05.06.2017
comment
@juanpa.arrivillaga, я протестировал этот код, и он работает, похоже, что json неверен и в json есть дополнительные символы «,». - person tom; 05.06.2017
comment
Да, я знаю, что код работает, но этот ответ не решает проблему OP, которая представляет собой список, выдающий IndexError. Действительно, код в вопросе ОП работает, поэтому очевидно, что проблема не в этом. - person juanpa.arrivillaga; 05.06.2017
comment
Опять же, это не имеет ничего общего с ошибкой, с которой сталкивается OP, которая вызвана индексацией списка за пределами допустимого диапазона. В образце данных, предоставленном OP, была опечатка, но это не основная проблема. - person juanpa.arrivillaga; 05.06.2017
comment
Просто узнал настоящую проблему. Пожалуйста, посмотрите отредактированную версию задачи. - person Aman Kumar; 05.06.2017
comment
@juanpa.arrivillaga , теперь ты это видишь ? Спасибо за помощь! - person tom; 05.06.2017