python - 将具有重复键的 dict 转换为包含这些键的列表
问题描述
我从 API 收到无法控制的响应。使用请求response.json()
将过滤掉重复的键。因此,我需要将此响应转换为一个列表,其中每个键都是该列表中的一个元素:我现在得到的:
{
"user": {
//...
},
"user": {
//...
},
//...
}
我需要的:
{
"users": [
{
"user": {
//...
}
},
{
"user": {
//...
}
},
//...
]
}
这样 JSON 就不会过滤掉任何结果,而且我可以遍历用户。
解决方案
好的,让我尝试一下Python json 解析器中使用的方法允许重复键
我们应该做的就是自己处理pairs_list。
from json import JSONDecoder
def parse_object_pairs(pairs):
return pairs
data = """
{"foo": {"key": 2, "key": 3}, "foo": 4, "foo": 23}
"""
decoder = JSONDecoder(object_pairs_hook=parse_object_pairs)
pairs_list = decoder.decode(data)
# the pairs_list is the real thing which we can use
aggre_key = 's'
def recusive_handle(pairs_list):
dct = {}
for k, v in pairs_list:
if v and isinstance(v, list) and isinstance(v[0], tuple):
v = recusive_handle(v)
if k + aggre_key in dct:
dct[k + aggre_key].append({k: v})
elif k in dct:
first_dict = {k: dct.pop(k)}
dct[k + aggre_key] = [first_dict, {k: v}]
else:
dct[k] = v
return dct
print(recusive_handle(pairs_list))
输出:
{'foos': [{'foo': {'keys': [{'key': 2}, {'key': 3}]}}, {'foo': {'bar': 4}}, {'foo': 23}]}
推荐阅读
- html - 缩小屏幕尺寸时使搜索栏响应吗?
- c# - 访问不同 aspx 文件中的 HTML 元素的 ID,然后在其他文件的代码隐藏文件中使用
- tableau-api - 如何创建按维度过滤的新度量?
- excel - 将条件添加到我的副本并根据匹配日期从一张纸粘贴到另一张纸
- javascript - 缺少一块?自己的石头剪刀布游戏
- grammar - 什么是终结符号和非终结符号?
- vscode-settings - 有没有办法在 Visual Studio Code 中执行此键绑定?
- django - 在 Django 的 html 页面上显示数据库中的数据的问题
- javascript - 避免代码重复 - reactJs - javascript
- angular - Ionic 4 ToastController 按钮没有异步功能