Превратить dict с повторяющимися ключами в список, содержащий эти ключи - PullRequest
0 голосов
/ 09 июля 2020

Я получаю ответ от API, который не могу контролировать. Использование запросов response.json() отфильтрует повторяющиеся ключи. Поэтому мне нужно было бы превратить этот ответ в список, где каждый ключ является элементом в этом списке: Что я получаю сейчас:

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

Что мне нужно:

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

Таким образом JSON не будет отфильтровывать какие-либо результаты, и я могу oop через пользователей.

1 Ответ

1 голос
/ 10 июля 2020

Хорошо, позвольте мне попробовать метод, используемый в Python json парсер, разрешающий дублирование ключей

Все, что нам нужно сделать, это обработать Pair_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}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...