Простой Python. Современный стиль программирования (Любанович) - страница 126

В отличие от 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)