Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2015-04-01

simplejson.dumps

Расскажу про грабли, на которые я сегодня потратил больше часа времени.

Контекст: 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

Комментариев нет:

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

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) Klaipeda (14) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)