Here is the JSON data I have:
这是我拥有的JSON数据:
{
"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"
}
]
}
}
I'm trying to parse "catalog" and "foreign_id". Here is my code:
我正在尝试解析“catalog”和“foreign_id”。这是我的代码:
for item in data['response']['artists']:
for row in item['foreign_ids']:
print row['catalog'], row['foreign_id']
The results are:
结果是:
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'
I think I know why; the last data row does not have "foreign_ids". How would I include an if statement to help me avoid this error? For example, the code outputs "None" when there is no array value called "foreign_ids".
我想我知道为什么;最后一个数据行没有“foreign_ids”。我如何包含if语句来帮助我避免此错误?例如,当没有名为“foreign_ids”的数组值时,代码输出“None”。
4 个解决方案
#1
You have to check to see if that column exists before you attempt to iterate over it. This approach is known as "look before you leap". Here we're using get
, since it will return None
by default and not raise the KeyError
.
在尝试迭代该列之前,您必须检查该列是否存在。这种方法被称为“在你跳跃之前看”。这里我们使用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']
Alternatively, you could employ a default value through get
which supplies an empty list to iterate over instead.
或者,您可以使用默认值get,它提供一个空列表来代替迭代。
for item in data['response']['artists']:
for row in item.get('foreign_ids', []):
print row['catalog'], row['foreign_id']
In both cases, you have to check to see if that key exists. The code you have assumes that it's always present, which is definitely not the case.
在这两种情况下,您都必须检查该密钥是否存在。您所拥有的代码假定它始终存在,但绝对不是这样。
#2
Instead of an if
statement (which is perfectly valid), you can use a try/except block:
您可以使用try / except块代替if语句(完全有效):
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)
This gives:
...
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}
which IMO is cleaner since it explicitly acknowledges the problem and acts on it. Instead of print, you can do an alternate action like a log.
哪个国际海事组织更清洁,因为它明确承认问题并采取行动。您可以执行日志等备用操作,而不是打印。
#3
You could check to see if the key is in that part of the JSON object by doing:
您可以通过执行以下操作来检查密钥是否在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']
#4
if 'foreign_ids' not in item:
continue
for row in item['foreign_ids']:
....
#1
You have to check to see if that column exists before you attempt to iterate over it. This approach is known as "look before you leap". Here we're using get
, since it will return None
by default and not raise the KeyError
.
在尝试迭代该列之前,您必须检查该列是否存在。这种方法被称为“在你跳跃之前看”。这里我们使用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']
Alternatively, you could employ a default value through get
which supplies an empty list to iterate over instead.
或者,您可以使用默认值get,它提供一个空列表来代替迭代。
for item in data['response']['artists']:
for row in item.get('foreign_ids', []):
print row['catalog'], row['foreign_id']
In both cases, you have to check to see if that key exists. The code you have assumes that it's always present, which is definitely not the case.
在这两种情况下,您都必须检查该密钥是否存在。您所拥有的代码假定它始终存在,但绝对不是这样。
#2
Instead of an if
statement (which is perfectly valid), you can use a try/except block:
您可以使用try / except块代替if语句(完全有效):
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)
This gives:
...
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}
which IMO is cleaner since it explicitly acknowledges the problem and acts on it. Instead of print, you can do an alternate action like a log.
哪个国际海事组织更清洁,因为它明确承认问题并采取行动。您可以执行日志等备用操作,而不是打印。
#3
You could check to see if the key is in that part of the JSON object by doing:
您可以通过执行以下操作来检查密钥是否在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']
#4
if 'foreign_ids' not in item:
continue
for row in item['foreign_ids']:
....