json将dictionary项更改为具有一个dictionary的列表

2024-04-18 11:20:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用restapi查找地址详细信息。我给它传递一个地址,它会传回该地址的详细信息:lat/long等。我在响应上使用带有json()方法的requests库,并将json响应添加到一个列表中,以便稍后进行分析。你知道吗

我发现,当一个地址只有一个匹配项时,json响应中的'FoundAddress'键包含一个字典,但当找到多个匹配项时,'FoundAddress'键包含一个字典列表。你知道吗

返回的json类似于:

对于单个匹配:

{
'FoundAddress': {AddressDetails...}
}

对于多个匹配项:

{
'FoundAddress': [{Address1Details...}, {Address2Details...}]
}

我不想编写代码来处理单个匹配,然后再处理多个匹配。你知道吗

如何修改“FoundAddress”,以便在有单个匹配项时将其更改为具有单个字典条目的列表?所以我得到了这样的结果:

{
'FoundAddress': [{AddressDetails...}]
}

Tags: 方法restapijson列表字典地址详细信息requests
2条回答

如果可以的话,我就修改API。如果你做不到,你就没有什么神奇的办法了。你只需要处理特殊情况。您可能可以在代码中的一个位置使用以下函数来执行此操作:

def handle_found_addresses(found_addresses):
    if not isinstance(found_addresses, list):
        found_addresses = [found_addreses]
         ... 

然后从那里开始对找到的地址执行任何操作,就好像值总是一个包含一个或多个项的列表一样。你知道吗

如果是外部API以这种格式发送响应,那么就不能真正更改FoundAddress本身,因为它总是以这种格式到达。你知道吗

如果愿意,您可以更改响应,因为您可以完全控制收到的内容:

r = json.parse(response)
fixed = r['FoundAddress'] if (type(r['FoundAddress']) is list) else [r['FoundAddress']]
r['FoundAddress'] = fixed

或者,您可以在地址使用时进行区分:

def func(foundAddress):
   # work with a single dictionary instance here

然后:

result = map(func, r['FoundAddress']) if (type(r['FoundAddress']) is list) else [func(r['FoundAddress'])]

但老实说,我得说清楚:

if type(r['FoundAddress']) is list:
   result = map(func, r['FoundAddress'])
else:
   result = func(r['FoundAddress'])

或者响应在a if b else c一行上固定。你知道吗

相关问题 更多 >