Глубокая сортировка списка json списка (с глубоким вложением) - с json, имеющим дублирующиеся ключи - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь глубоко отсортировать список json списка ( и т. Д., Который может go рекурсивно вложенный ), где json может иметь дубликат и без указания c введите json для сортировки.

Ввод:

{"payload": [
  {
    "a": {
      "aa": [
        {
          "aa12": {
            "aaa23": 230,
            "aaa21": 210,
            "aaa.something": "yes"
          }
        },
        {
          "aa11": {
            "aaa12": 120,
            "aaa11": 110
          }
        },
        {
          "aa13": {
            "aaa35": 350,
            "aaa32": 320,
            "aaa.someattr": "true"
          }
        }
      ],
      "aa": [
        {
          "aa12": {
            "aaa22": 22,
            "aaa21": 21
          }
        },
        {
          "aa10": {
            "aaa03": 3,
            "aaa01": 1
          }
        },
        {
          "aa13": {
            "aaa33": 33,
            "aaa32": 32
          }
        },
        {
          "aa1": "aab"
        }
      ],
      "ac": [
        "ac3",
        "ac1",
        "ac2"
      ]
    }
  },
  {
    "b": {
      "bb": [
        "bb4",
        "bb2",
        "bb3",
        "bb1"
      ]
    }
  }
]}

Ожидаемый вывод:

{"payload": [
  {
    "a": {
      "aa": [
        {
          "aa1": "aab"
        },
        {
          "aa10": {
            "aaa01": 1,
            "aaa03": 3
          }
        },
        {
          "aa12": {
            "aaa21": 21,
            "aaa22": 22
          }
        },
        {
          "aa13": {
            "aaa32": 32,
            "aaa33": 33
          }
        }
      ],
      "aa": [
        {
          "aa11": {
            "aaa11": 110,
            "aaa12": 120
          }
        },
        {
          "aa12": {
            "aaa.something": "yes"
            "aaa21": 210,
            "aaa23": 230
          }
        },
        {
          "aa13": {
            "aaa.someattr": "true",
            "aaa32": 320,
            "aaa35": 350
          }
        }
      ],
      "ac": [
        "ac1",
        "ac2",
        "ac3"
      ]
    }
  },
  {
    "b": {
      "bb": [
        "bb1",
        "bb2",
        "bb3",
        "bb4"
      ]
    }
  }
]}

Я пытался использовать следующий рекурсивный метод:

ls = {'payload': [{'a': {'aa': [{'aa12': {'aaa23': 230, 'aaa21': 210}}, {'aa11': {'aaa12': 120, 'aaa11': 110}}, {'aa13': {'aaa35': 350, 'aaa32': 320}}], 'ac': ['ac3', 'ac1', 'ac2'], 'aa': [{'aa12': {'aaa22': 22, 'aaa21': 21}}, {'aa10': {'aaa03': 3, 'aaa01': 1}}, {'aa13': {'aaa33': 33, 'aaa32': 32}}, {'aa1': 'aab'}]}}, {'b': {'bb': ['bb4', 'bb2', 'bb3', 'bb1']}}]}
output = sorted_deep(ls)
print(output)

def sorted_deep(d):
  if isinstance(d,list):
    return sorted(sorted_deep(v) for v in d)
  if isinstance(d,dict):
    return {k: sorted_deep(d[k]) for k in sorted(d)}
  return d

Но это не работает. Он переопределяет значение дубликата ключа на последнее найденное значение при сортировке. Поскольку дубликат ключа может быть любой строкой, мы не можем выполнить итерацию, указав имя ключа. Я ищу универсальное c решение, которое сортирует любой заданный сложный список json - с вложенным списком / json.

Моя конечная цель - глубокое совпадение 2 таких JSON, чтобы найти различия.

1 Ответ

0 голосов
/ 18 января 2020

Рассмотрите возможность использования sorted ()

sorted(paymentsByAgreeement[agreement['agreementId']],key=lambda i: 
(i['eventDate'],i['id']))

читайте о отсортированном и лямбда здесь https://wiki.python.org/moin/HowTo/Sorting с лямбда, вы можете получить доступ к дочерним элементам на go глубже, вам может понадобиться и еще одна лямбда с сортировкой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...