объединить дубликаты ключей в JSON - PullRequest
0 голосов
/ 25 января 2019

У меня есть json, который выглядит следующим образом:

{
  "course1": [
    {
      "courseName": "test",
      "section": "123",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    }
  ],
  "course2": [
    {
      "courseName": "test",
      "section": "456",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    }
  ],
  "course2": [
    {
      "courseName": "test",
      "section": "789",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    }
  ],
  "course2": [
    {
      "courseName": "test",
      "section": "1011",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    }
  ],
  "course3": [
    {
      "courseName": "test",
      "section": "1213",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    }
  ],
  "course3": [
    {
      "courseName": "test",
      "section": "1415",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    }
  ]
}

, и я хочу объединить любой блок / объект / список (я не знаю, как он называется), чтобы они имели одинаковое значение ключа,как это:

{
  "course1": [
    {
      "courseName": "test",
      "section": "123",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    }
  ],
  "course2": [
    {
      "courseName": "test",
      "section": "456",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    },
    {
      "courseName": "test",
      "section": "789",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    },
    {
      "courseName": "test",
      "section": "1011",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    }
  ],
  "course3": [
    {
      "courseName": "test",
      "section": "1213",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    },
    {
      "courseName": "test",
      "section": "1415",
      "academicHours": "3",
      "day1": "1",
      "room1": "0145 03 1 B 015"
    }
  ]
}

Как я могу сделать это с помощью регулярного выражения в Python?или какой-либо запрос регулярного выражения?

Кроме того, я пытался использовать json.dumps() и работать оттуда, но по какой-то причине, когда я использую его с любым JSON, который содержит арабские символы, он волнуется и портит всевещь.так что я застрял с регулярным выражением, к сожалению.

и спасибо за вашу помощь:)

1 Ответ

0 голосов
/ 25 января 2019

stdlib json предлагает хук, позволяющий декодировать объекты с дублирующимися ключами. Этот простой «расширенный» хук должен работать для данных вашего примера:

def myhook(pairs):
    d = {}
    for k, v in pairs:
        if k not in d:
          d[k] = v
        else:
          d[k] += v
    return d

mydata = json.loads(bad_json, object_pairs_hook=myhook)

Хотя в спецификации JSON нет ничего, что запрещало бы дублирование ключей, в первую очередь СЛЕДУЕТ избегать:

1,1. Условные обозначения, используемые в этом документе

Ключевые слова "ДОЛЖЕН", "НЕ ДОЛЖЕН", "ТРЕБУЕТСЯ", "ДОЛЖЕН", "НЕ ДОЛЖЕН", «СЛЕДУЕТ», «НЕ СЛЕДУЕТ», «РЕКОМЕНДУЕТСЯ», «МОЖЕТ» и «ДОПОЛНИТЕЛЬНО» в этом Документ должен интерпретироваться как описано в [RFC2119].

...

  1. Предметы

    Структура объекта представляется в виде пары фигурных скобок окружающий ноль или более пар имя / значение (или членов). Имя это строка. После каждого имени стоит двоеточие, отделяя имя от стоимости. Одна запятая отделяет значение от следующего название. Имена внутри объекта ДОЛЖНЫ быть уникальными.

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