Работа с JSON

Как всегда, ввод-вывод в задачах этого листка может быть как стандартным, так и файловым (input.txt/output.txt). Используемая кодировка для русских букв: UTF-8.

A: Считываем JSON

Программа получает на вход описание одного объекта в формате JSON. Программа должна вывести все пары ключ–значение этого объекта, разделяя их двоеточием. Используйте для этого функцию json.load. Выведите пары ключ–значение, разделяя их двоеточием и пробелом, упорядочив по ключу. Кавычки вокруг строк выводить не надо, см. пример.

Ввод Вывод
{
    "street": "Большая Дмитровка",
    "city": "Москва",
    "country": "Россия"
}
city: Москва
country: Россия
street: Большая Дмитровка

B: Записываем JSON

Решите обратную задачу. Программа получает на вход пары ключ–значение, разделённых двоеточием и пробелом. Создайте словарь из этих пар (все значения считаем строками) и выведите его в формате JSON.

Если вас смущают строки вида "\u041c\u043e\u0441\u043a\u0432\u0430" в выводе, используете параметр ensure_ascii=False. А можете оставить, как есть.

Ввод Вывод
city: Москва
country: Россия
street: Большая Дмитровка
{
    "street": "Большая Дмитровка",
    "city": "Москва",
    "country": "Россия"
}

C: Разные типы JSON

Объекты в JSON могут быть следующих типов

Вам дан JSON-объект, являющийся списком. Пройдитесь по его элементам, и со всеми элементами сделайте следующее:

Если это строка, добавьте к конец строки восклицательный знак.

Если это число, то увеличьте его на 1.

Если это логическое значение, то инвертируйте его.

Если это список, то удвойте его.

Если это объект, то добавьте к нему новый атрибут с ключом "newkey" и пустым значением.

Если это пустое значение, то удалите его из списка.

Выведите полученный JSON.

Ввод Вывод
["Hello", 179, 0.5, true, null, [1, 2, 3], {"key": "value"}]
["Hello!", 180, 1.5, false, [1, 2, 3, 1, 2, 3], {"key": "value", "newkey": null}]

D: Обновление объекта

Даны два объекта JSON. Необходимо объединить их вместе по следующему правилу: результат берёт все атрибуты из первого объекта, а если во втором объекте содержатся атрибуты с такими же ключами, как и у первого объекта, или отсутстсвующие в первом объекте, то они также добавляются в результат.

Программа получает на вход JSON-список из двух JSON-объектов и должна вывести один JSON-объект.

Ввод Вывод
[{"firstName": "Иван", "middleName": "Петров", "birthDate": "2001/02/29"},
{"city": "Moscow", "birthDate": "2001/02/28"}]
{"middleName": "Петров", "firstName": "Иван", "city": "Moscow", "birthDate": "2001/02/28"}

E: Восстановление недостающих атрибутов

Дан список объектов JSON, у них могут быть разные атрибуты. При этом у разных объектов может быть разный набор атрибутов: некоторых атрибутов может не хватать. Добавьте ко всем объектам недостающие атрибуты: создайте их, записав туда значения null.

Атрибут у некоторого объекта считается отсутствующим, если у какого-то другого объекта есть атрибут с таким ключом, а у этого объекта его нет.

Ввод Вывод
[{"firstName": "Иван", "middleName": "Петров", "birthDate": "2001/02/29"},
{"firstName": "Пётр", "middleName": "Иванов", "city": "Moscow"}]
[{"city": null, "middleName": "Петров", "birthDate": "2001/02/29", "firstName": "Иван"},
{"city": "Moscow", "middleName": "Иванов", "birthDate": null, "firstName": "Пётр"}]

F: Рекурсивное суммирование

Дан объект JSON, являющийся списком. Элементами списка могут быть только числа или аналогичные списки, содержащие числа и вложенные списки и т.д. Найдите сумму всех чисел во всех списках.

Сумма пустого списка равна 0.

Ввод Вывод
[1, 2, [3, [4, 5]], [6, []]]
21

G: Рекурсивный обход

Дан объект JSON, являющийся словарём. Атрибутами словаря могут быть числа, строки или аналогичные словари.

Выведите все пары ключ–значение словаря, рекурсивно выводя значения атрибутов всех дочерних словарей. При выводе атрибутов необходимо перечислять имена всех ключей, начиная с верхнего уровня, разделяя их точками (см. пример).

Выводите ключи в лексикографическом порядке.

Ввод Вывод
{
  "firstName": "Иван",
  "lastName": "Иванов",
  "birthDate": {
    "day": 10,
    "month": "October",
    "year": 2002
  },
  "address": {
    "streetAddress": "Московское ш., 101, кв.101",
    "city": {
      "region": "Ленинградская область",
      "type": "город",
      "cityName": "Сосново"
    },
    "postalCode": "101101"
  }
}
address.city.cityName: Сосново
address.city.region: Ленинградская область
address.city.type: город
address.postalCode: 101101
address.streetAddress: Московское ш., 101, кв.101
birthDate.day: 10
birthDate.month: October
birthDate.year: 2002
firstName: Иван
lastName: Иванов

H: Рекурсивное обновление

Даны два объекта JSON, являющихся словарём. Атрибутами словаря могут быть числа, строки или аналогичные словари (как в предыдущей задаче).

Выполните обновление первого объекта данными из второго объекта. При этом если атрибут с одинаковым названием и в первом, и во втором объекте является словарём, необходимо выполнить процедуру обновление рекурсивно для этого объекта.

Если же атрибут с одинаковым ключом является словарём только у одного из двух объектов, то берётся значение второго объекта.

Программа получает на вход JSON-список из двух JSON-объектов и должна вывести один JSON-объект.

Ввод Вывод
[
{
  "a": 123,
  "c": "qwe",
  "d": {
    "da": 10,
    "db": 20,
    "dz": {
      "x": {}
    }
  }
},
{
  "a": {"a1": "abc"},
  "b": 456,
  "d": {
    "db": 30,
    "dc": 40,
    "dz": {
      "y": 0
    }
  }
}
]
{
  "b": 456,
  "d": {
    "dc": 40,
    "db": 30,
    "dz": {
      "x": {},
      "y": 0
    },
    "da": 10
  },
  "c": "qwe",
  "a": {
    "a1": "abc"
  }
}