В отличие от XML, для которого написано множество модулей, для JSON существует всего один модуль с простым именем json. Эта программа кодирует (выгружает) данные в строку JSON и декодирует (загружает) строку JSON обратно. В следующем примере мы создадим структуру данных, содержащую данные из предыдущего примера, где описывался формат XML:
>>>> menu = \
>… {
>… "breakfast": {
>…·········"hours": "7-11",
>…·········"items": {
>…·················"breakfast burritos": "$6.00",
>…·················"pancakes": "$4.00"
>…·················}
>…·········},
>… "lunch": {
>…·········"hours": "11-3",
>…·········"items": {
>…·················"hamburger": "$5.00"
>…·················}
>…·········},
>… "dinner": {
>…·········"hours": "3-10",
>…·········"items": {
>…·················"spaghetti": "$8.00"
>…·················}
>…·········}
>… }
>.
Далее закодируем структуру данных (menu) в строку JSON (menu_json) с помощью функции dumps():
>>>> import json
>>>> menu_json = json.dumps(menu)
>>>> menu_json
>'{"dinner": {"items": {"spaghetti": "$8.00"}, "hours": "3-10"},
>"lunch": {"items": {"hamburger": "$5.00"}, "hours": "11-3"},
>"breakfast": {"items": {"breakfast burritos": "$6.00", "pancakes":
>"$4.00"}, "hours": "7-11"}}'
А теперь превратим строку JSON menu_json обратно в структуру данных (menu2) с помощью функции loads():
>>>> menu2 = json.loads(menu_json)
>>>> menu2
>{'breakfast': {'items': {'breakfast burritos': '$6.00', 'pancakes':
>'$4.00'}, 'hours': '7-11'}, 'lunch': {'items': {'hamburger': '$5.00'},
>'hours': '11-3'}, 'dinner': {'items': {'spaghetti': '$8.00'}, 'hours': '3-10'}}
menu и menu2 являются словарями с одинаковыми ключами и значениями. Как всегда, в случае обычных словарей порядок, в котором вы получаете ключи, различается.
Вы можете получить исключение, пытаясь закодировать или декодировать некоторые объекты, включая такие объекты, как datetime (этот вопрос детально рассматривается в разделе «Календари и часы» главы 10), как показано здесь:
>>>> import datetime
>>>> now = datetime.datetime.utcnow()
>>>> now
>datetime.datetime(2013, 2, 22, 3, 49, 27, 483336)
>>>> json.dumps(now)
>Traceback (most recent call last):
>#… (deleted stack trace to save trees)
>TypeError: datetime.datetime(2013, 2, 22, 3, 49, 27, 483336) is not JSON serializable
>>>>
Это может случиться, поскольку стандарт JSON не определяет типы даты или времени — он ожидает, что вы укажете ему, как с ними работать. Вы можете преобразовать формат datetime во что-то, что JSON понимает, вроде строки или значения времени epoch (его мы рассмотрим в главе 10):
>>>> now_str = str(now)
>>>> json.dumps(now_str)