2015-05-05 59 views
2

这里是JSON数据,我有:解析JSON使用Python和if语句

{ 
    "response": { 
    "status": { 
     "version": "4.2", 
     "code": 0, 
     "message": "Success" 
    }, 
    "artists": [ 
     { 
     "name": "Taylor Swift", 
     "foreign_ids": [ 
      { 
      "catalog": "facebook", 
      "foreign_id": "facebook:artist:19614945368" 
      } 
     ], 
     "hotttnesss": 0.99956, 
     "id": "ARS54I31187FB46721" 
     }, 
     { 
     "name": "Ed Sheeran", 
     "foreign_ids": [ 
      { 
      "catalog": "facebook", 
      "foreign_id": "facebook:artist:9189674485" 
      } 
     ], 
     "hotttnesss": 0.994265, 
     "id": "ARSDWSZ122ECCB706A" 
     }, 
     { 
     "name": "Calvin Harris", 
     "foreign_ids": [ 
      { 
      "catalog": "facebook", 
      "foreign_id": "facebook:artist:19366141168" 
      } 
     ], 
     "hotttnesss": 0.990559, 
     "id": "ARJRB241187FB556A3" 
     }, 
     { 
     "name": "Sam Smith", 
     "foreign_ids": [ 
      { 
      "catalog": "facebook", 
      "foreign_id": "facebook:artist:313595788739120" 
      } 
     ], 
     "hotttnesss": 0.988203, 
     "id": "ARUZM8A11C8A41519C" 
     }, 
     { 
     "name": "Maroon 5", 
     "foreign_ids": [ 
      { 
      "catalog": "facebook", 
      "foreign_id": "facebook:artist:5330548481" 
      } 
     ], 
     "hotttnesss": 0.984929, 
     "id": "ARF5M7Q1187FB501E8" 
     }, 
     { 
     "name": "Sia", 
     "foreign_ids": [ 
      { 
      "catalog": "facebook", 
      "foreign_id": "facebook:artist:10959868407" 
      } 
     ], 
     "hotttnesss": 0.983516, 
     "id": "AR6ENUY1187B994158" 
     }, 
     { 
     "name": "David Guetta", 
     "foreign_ids": [ 
      { 
      "catalog": "facebook", 
      "foreign_id": "facebook:artist:7619396355" 
      } 
     ], 
     "hotttnesss": 0.982656, 
     "id": "ARH2QI91187FB3788D" 
     }, 
     { 
     "name": "Ellie Goulding", 
     "foreign_ids": [ 
      { 
      "catalog": "facebook", 
      "foreign_id": "facebook:artist:135027136641" 
      } 
     ], 
     "hotttnesss": 0.981786, 
     "id": "ARKTTJV12592CDA07F" 
     }, 
     { 
     "name": "Wiz Khalifa", 
     "foreign_ids": [ 
      { 
      "catalog": "facebook", 
      "foreign_id": "facebook:artist:12138756141" 
      } 
     ], 
     "hotttnesss": 0.978492, 
     "id": "ARN0GFV1187FB508CC" 
     }, 
     { 
     "name": "Ariana Grande", 
     "hotttnesss": 0.978074, 
     "id": "AROHQCR13244CF7152" 
     } 
    ] 
    } 
} 

我试图解析“目录”和“foreign_id”。这里是我的代码:

for item in data['response']['artists']: 
    for row in item['foreign_ids']: 
     print row['catalog'], row['foreign_id'] 

的结果是:

facebook facebook:artist:19614945368 
facebook facebook:artist:9189674485 
facebook facebook:artist:19366141168 
facebook facebook:artist:313595788739120 
facebook facebook:artist:5330548481 
facebook facebook:artist:10959868407 
facebook facebook:artist:7619396355 
facebook facebook:artist:135027136641 
facebook facebook:artist:12138756141 

KeyError 
Traceback (most recent call last) 
<ipython-input-224-cbc34d6d831e> in <module>() 
     1 for item in data['response']['artists']: 
----> 2  for row in item['foreign_ids']: 
     3   print row['catalog'], row['foreign_id'] 

KeyError: 'foreign_ids' 

我想我知道为什么;最后一个数据行没有“foreign_ids”。如何包含if语句以帮助我避免此错误?例如,当没有名为“foreign_ids”的数组值时,代码输出“无”。

回答

2

在尝试迭代它之前,您必须检查该列是否存在。这种方法被称为“看你跳跃之前”。这里我们使用的是get,因为默认情况下它将返回None,而不会提高KeyError

for item in data['response']['artists']: 
    if item.get('foreign_ids'): 
     for row in item['foreign_ids']: 
      print row['catalog'], row['foreign_id'] 

另外,还可以采用通过get它提供一个空的列表,而不是遍历一个默认值。

for item in data['response']['artists']: 
    for row in item.get('foreign_ids', []): 
     print row['catalog'], row['foreign_id'] 

在这两种情况下,你必须检查,看看是否存在的关键。你所拥有的代码假设它总是存在的,这绝对不是这种情况。

+0

谢谢大家好的建议! – kevin

0
if 'foreign_ids' not in item: 
    continue 
for row in item['foreign_ids']: 
.... 
+0

我会以另一种方式写入它(例如,'if'foreign_ids'in item:'),但这足够了。 – Makoto

+0

我更喜欢continue方法,因为它可以缓解大量的缩进:)。给每个人自己。 –

1

你可以检查,看看是否关键是JSON对象的那部分做:

if 'somekey' in somPartOfTheJson: 
    jsonObj = json.loads(jsonStr) 

    for item in jsonObj['response']['artists']: 
     if 'foreign_ids' in item: 
      for row in item['foreign_ids']: 
       if 'catalog' in row and 'foreign_id' in row: 
        print row['catalog'], row['foreign_id'] 
+0

感谢您的建议!这工作。 – kevin

1

代替if声明(这是完全合法的),你可以使用try/except块:

for item in data['response']['artists']: 
    try:  
     for row in item['foreign_ids']: 
      print row['catalog'], row['foreign_id'] 
    except KeyError as Ex: 
     print "{} not found in {}".format(Ex,item) 

这给:

... 
facebook facebook:artist:7619396355 
facebook facebook:artist:135027136641 
facebook facebook:artist:12138756141 
'foreign_ids' not found in {'id': 'AROHQCR13244CF7152', 'name': 'Ariana Grande', 'hotttnesss': 0.978074} 

这IMO是因为它清洁一明确认识到问题并采取行动。而不是打印,你可以做一个替代动作,如log

+0

感谢您的建议!这工作。 – kevin