Разблокировать dict, полученный из JSON с использованием Python - PullRequest
0 голосов
/ 27 октября 2018

Эта структура JSON взята из конфигурации сервера Spring Cloud:

{
  "item[0].subitem[0].key": "value1",
  "item[0].subitem[1].key": "value2",
  "item[1].subitem[0].key": "value3",
  "item[1].subitem[1].key": "value4"
}

У меня есть приложение Flask, которое будет использовать этот формат, но мне нужно преобразовать его в этот формат для дальнейшей обработки:

{
  "item": [
    {
      "subitem": [
        {
          "key": "value1"
        },
        {
          "key": "value1"
        }
      ]
    },
    {
      "subitem": [
        {
          "key": "value1"
        },
        {
          "key": "value1"
        }
      ]
    }
  ]
}

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Я объяснил, почему я не хочу предоставлять полное решение в комментариях к вопросу ОП.Это должно быть достаточно подсказка:

def main():
    input = {
        "item[0].subitem[0].key": "value1",
        "item[0].subitem[1].key": "value2",
        "item[1].subitem[0].key": "value3",
        "item[1].subitem[1].key": "value4",
    }
    items = list(input.items())
    random.shuffle(items)
    shuffled = dict(items)

    result = normalize_keys(unflatten(shuffled))

    print(json.dumps(result, indent=2))

Результаты в:

{
  "item": [
    {
      "subitem": [
        {
          "key": "value1"
        },
        {
          "key": "value2"
        }
      ]
    },
    {
      "subitem": [
        {
          "key": "value3"
        },
        {
          "key": "value4"
        }
      ]
    }
  ]
}
0 голосов
/ 29 октября 2018

или используйте сделанный для этого пакет:

https://github.com/amirziai/flatten

pip install flatten_json

которые поддерживают выравнивание и разглаживание.

0 голосов
/ 27 октября 2018

В приведенном ниже коде показано обобщенное решение, которое включает в себя больше тестовых случаев, чем требуется:

import re
j = {
  "item[0].subitem[0].key": "value1",
  "item[0].subitem[1].key": "value2",
  "item[1].subitem[0].key": "value3",
  "item[1].subitem[1].key": "value4",
  "item2[0].subitem[0]": "value5",
  "item2[0].subitem[1]": "value6",
  "item2[1][0].key1": "value7",
  "item2[1][1].key2": "value8"
}
d = {}
for key, value in j.items():
    s = d
    tokens = re.findall(r'\w+', key)
    for count, (index, next_token) in enumerate(zip(tokens, tokens[1:] + [value]), 1):
        value = next_token if count == len(tokens) else [] if next_token.isdigit() else {}
        if isinstance(s, list):
            index = int(index)
            while index >= len(s):
                s.append(value)
        elif index not in s:
            s[index] = value
        s = s[index]

d становится:

{'item': [{'subitem': [{'key': 'value1'}, {'key': 'value2'}]},
          {'subitem': [{'key': 'value3'}, {'key': 'value4'}]}],
 'item2': [{'subitem': ['value5', 'value6']},
           [{'key1': 'value7'}, {'key2': 'value8'}]]}
...