Расскажу про
грабли, на которые я сегодня потратил
больше часа времени.
Контекст:
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
Комментариев нет:
Отправить комментарий