如何解析包含多个对象的 JSON 响应
How to parse JSON response that includes multiple objects
我在单个 JSON 响应中调用 returns 多个对象的 REST API。使用 Python 2.7 我正在尝试解析此响应,以便我可以在响应中为所有对象打印其中一些值。
从 REST API 的响应中给出的 所有 个对象中提取此数据的最佳方法是什么?
我想要一个列表,其中包含 JSON 响应中每个对象的 "key"、"name" 和 "emailAddress"。
这就是我在响应中对单个对象的处理方式:
>>>> a = json.loads(response)
>>> print a.get(key), ";", a.get('name'), ";", a.get('emailAddress')
keyOne ; nameOne ; mailOne
对于多个对象,我希望每个对象都有键;名称;显示在新行上的电子邮件。
响应数据的结构如下:
[
{
"self": "https://example1.com",
"key": "keyOne",
"name": "nameOne",
"emailAddress": "mailOne",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=1",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=1",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=1",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=1"
},
"displayName": "displayNameOne",
"active": true,
"timeZone": "Europe",
"locale": "en_UK"
},
{
"self": "https://example2.com",
"key": "keyTwo",
"name": "nameTwo",
"emailAddress": "mailTwo",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=2",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=2",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=2",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=2"
},
"displayName": "displayNameTwo",
"active": false,
"timeZone": "Europe",
"locale": "en_US"
}
]
迭代响应列表以获取所需键的值:
j_res = [
{
"self": "https://example1.com",
# rest of the response here
"timeZone": "Europe",
"locale": "en_US"
}
]
for elem in j_res:
print(elem.get('key', "Key does not exist"), elem.get('name', 'Name does not exist'), elem.get('emailAddress', 'emailAddress does not exist'))
输出:
keyOne nameOne mailOne
keyTwo nameTwo mailTwo
编辑:
如果您希望它们在元组列表中:
print([(elem.get('key', None), elem.get('name', None), elem.get('emailAddress', None)) for elem in j_res])
输出:
[('keyOne', 'nameOne', 'mailOne'), ('keyTwo', 'nameTwo', 'mailTwo')]
编辑 2:
由于响应 returns 是布尔值 (true
/false
) 而不是字符串,解决方法是将响应转换为字符串,然后替换字符串的无效布尔值,然后迭代列表:
j_res = '''[
{
"self": "https://example1.com",
"key": "keyOne",
"name": "nameOne",
"emailAddress": "mailOne",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=1",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=1",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=1",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=1"
},
"displayName": "displayNameOne",
"active": true, # notice this
"timeZone": "Europe",
"locale": "en_UK"
},
{
"self": "https://example2.com",
"key": "keyTwo",
"name": "nameTwo",
"emailAddress": "mailTwo",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=2",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=2",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=2",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=2"
},
"displayName": "displayNameTwo",
"active": false, # notice this
"timeZone": "Europe",
"locale": "en_US"
}
]'''
from ast import literal_eval
res = literal_eval(j_res.replace("true","'true'").replace("false", "'false'"))
print([(elem.get('key', None), elem.get('name', None), elem.get('emailAddress', None)) for elem in res])
输出:
[('keyOne', 'nameOne', 'mailOne'), ('keyTwo', 'nameTwo', 'mailTwo')]
响应只是一个对象数组。您需要遍历此数组并打印您正在为一个对象打印的键。
resp = ...
for a in resp:
print a.get(key), ";", a.get('name'), ";", a.get('emailAddress')
我在单个 JSON 响应中调用 returns 多个对象的 REST API。使用 Python 2.7 我正在尝试解析此响应,以便我可以在响应中为所有对象打印其中一些值。
从 REST API 的响应中给出的 所有 个对象中提取此数据的最佳方法是什么?
我想要一个列表,其中包含 JSON 响应中每个对象的 "key"、"name" 和 "emailAddress"。
这就是我在响应中对单个对象的处理方式:
>>>> a = json.loads(response)
>>> print a.get(key), ";", a.get('name'), ";", a.get('emailAddress')
keyOne ; nameOne ; mailOne
对于多个对象,我希望每个对象都有键;名称;显示在新行上的电子邮件。
响应数据的结构如下:
[
{
"self": "https://example1.com",
"key": "keyOne",
"name": "nameOne",
"emailAddress": "mailOne",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=1",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=1",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=1",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=1"
},
"displayName": "displayNameOne",
"active": true,
"timeZone": "Europe",
"locale": "en_UK"
},
{
"self": "https://example2.com",
"key": "keyTwo",
"name": "nameTwo",
"emailAddress": "mailTwo",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=2",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=2",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=2",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=2"
},
"displayName": "displayNameTwo",
"active": false,
"timeZone": "Europe",
"locale": "en_US"
}
]
迭代响应列表以获取所需键的值:
j_res = [
{
"self": "https://example1.com",
# rest of the response here
"timeZone": "Europe",
"locale": "en_US"
}
]
for elem in j_res:
print(elem.get('key', "Key does not exist"), elem.get('name', 'Name does not exist'), elem.get('emailAddress', 'emailAddress does not exist'))
输出:
keyOne nameOne mailOne
keyTwo nameTwo mailTwo
编辑:
如果您希望它们在元组列表中:
print([(elem.get('key', None), elem.get('name', None), elem.get('emailAddress', None)) for elem in j_res])
输出:
[('keyOne', 'nameOne', 'mailOne'), ('keyTwo', 'nameTwo', 'mailTwo')]
编辑 2:
由于响应 returns 是布尔值 (true
/false
) 而不是字符串,解决方法是将响应转换为字符串,然后替换字符串的无效布尔值,然后迭代列表:
j_res = '''[
{
"self": "https://example1.com",
"key": "keyOne",
"name": "nameOne",
"emailAddress": "mailOne",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=1",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=1",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=1",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=1"
},
"displayName": "displayNameOne",
"active": true, # notice this
"timeZone": "Europe",
"locale": "en_UK"
},
{
"self": "https://example2.com",
"key": "keyTwo",
"name": "nameTwo",
"emailAddress": "mailTwo",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=2",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=2",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=2",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=2"
},
"displayName": "displayNameTwo",
"active": false, # notice this
"timeZone": "Europe",
"locale": "en_US"
}
]'''
from ast import literal_eval
res = literal_eval(j_res.replace("true","'true'").replace("false", "'false'"))
print([(elem.get('key', None), elem.get('name', None), elem.get('emailAddress', None)) for elem in res])
输出:
[('keyOne', 'nameOne', 'mailOne'), ('keyTwo', 'nameTwo', 'mailTwo')]
响应只是一个对象数组。您需要遍历此数组并打印您正在为一个对象打印的键。
resp = ...
for a in resp:
print a.get(key), ";", a.get('name'), ";", a.get('emailAddress')