首页 > 解决方案 > 将具有重复键的 dict 转换为包含这些键的列表

问题描述

我从 API 收到无法控制的响应。使用请求response.json()将过滤掉重复的键。因此,我需要将此响应转换为一个列表,其中每个键都是该列表中的一个元素:我现在得到的:

{
  "user": {
    //...
  },
  "user": {
    //...
  },
  //...
}

我需要的:

{
  "users": [
   {
    "user": {
      //...
   }
   },
   {
    "user": {
      //...
    }
    },
    //...
  ]
}

这样 JSON 就不会过滤掉任何结果,而且我可以遍历用户。

标签: python

解决方案


好的,让我尝试一下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}]}

推荐阅读