Расскажу про
грабли, на которые я сегодня потратил
больше часа времени.
Контекст:
Naudoc, работающий на Zope 2.10, работающий на
Python 2.4
Итак, грабля
первая.
Хочу собранные
данные слить в файл формата JSON.
Ставлю simplejson
su -l wget http://pypi.python.org/packages/source/s/simplejson/simplejson-2.0.9.tar.gz#md5=af5e67a39ca3408563411d357e6d5e47 tar xzvf simplejson-2.0.9.tar.gz cd simplejson-2.0.9 /opt/python24/bin/python setup.py install
Только так, иначе на это древнее дерьмо
его не поставить.
И, пользуясь
принципом DRY, дергаю из старого проекта
проверенный код (сразу говорю, в нем
ошибка):
return simplejson.dumps(
data,
ensure_ascii=False,
indent=' ',
encoding=const.NAU_CP,
default=jsonify,
sort_keys=True)
После чего получаю иксепшн
TypeError: can't multiply sequence by non-int
Не сразу я докопался, что проблема в
задании параметра ident.
Правильный
код
return simplejson.dumps(
data,
ensure_ascii=False,
indent=4,
encoding=const.NAU_CP,
default=jsonify,
sort_keys=True)
Грабля вторая.
На том же месте,
при вызове
simplejson.dumps
возникает что-то вроде
Error DateTime('2015/03/18 02:33:44.625 GMT+3') is not JSON serializable
Тут фишка в том, что есть модуль
zope/lib/python/DateTime/DateTime.py
из которого
используется класс DateTime, во многих
местах Наудока. В том числе в атрибутах
объектов, из которых я забираю данные.
Чтобы победить
незнакомый simplejson-у тип данных, надо
делать как-то так:
def jsonify(obj):
if hasattr(obj, 'isoformat'):
return obj.isoformat()
elif isinstance(obj, DateTime):
return '%s' % obj.HTML4()
else:
raise TypeError(
'Object of type %s with value of %s is not JSON serializable' %
(type(obj), repr(obj)))
return simplejson.dumps(
data,
ensure_ascii=False,
indent=4,
encoding=const.NAU_CP,
default=jsonify,
sort_keys=True)
original post http://vasnake.blogspot.com/2015/04/simplejsondumps.html

Комментариев нет:
Отправить комментарий