การอ่านค่าจากไฟล์ Json

ฉันกำลังพยายามอ่านแอตทริบิวต์จากไฟล์ Json โดยใช้สิ่งนี้: d['text']['entities']['mention'][0]['screen_name']

ไฟล์เจสัน

{
    "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 แต่เป็น วัตถุหลาม JSON เป็นรูปแบบการทำให้เป็นอนุกรมข้อความ - person juanpa.arrivillaga; 05.06.2017
comment
@ juanpa.arrivillaga ฉันได้ทดสอบรหัสนี้แล้วและใช้งานได้ ดูเหมือนว่า json จะผิดและมี ',' พิเศษใน json - person tom; 05.06.2017
comment
ใช่ ฉันรู้ว่าโค้ดใช้งานได้ แต่คำตอบนี้ไม่ได้แก้ไขปัญหาของ OP ซึ่งเป็นรายการที่กำลังส่ง IndexError อันที่จริงโค้ดในคำถาม OPs ใช้งานได้ เห็นได้ชัดว่านี่ไม่ใช่ปัญหา - 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