сериализация класса sqlalchemy в json - PullRequest
3 голосов
/ 22 февраля 2012

Я пытаюсь сериализовать результат (список) запроса sqlalchemy в json.

это класс:

class Wikilink(Base):

    __tablename__='Wikilinks'
    __table_args__={'extend_existing':True}

    id = Column(Integer,autoincrement=True,primary_key=True)
    title = Column(Unicode(350))
    user_ip = Column(String(50))
    page = Column(String(20))
    revision = Column(String(20))
    timestamp = Column(String(50))

и я думаю, моя проблема с функцией __repr__(self):. Я пробовал что-то вроде:

return '{{0}:{"title":{1}, "Ip":{2}, "page":{3} ,"revision":{4}}}'.format(self.id,self.title.encode('utf-8'),self.user_ip,self.page,self.revision)

или

return '{"id"={0}, "title"={1}, "Ip"={2}}'.format(self.id,self.title.encode('utf-8'),self.user_ip.encode('utf-8'),self.page,self.revision)

и я получил:

TypeError(repr(o) + " is not JSON serializable")
ValueError: Single '}' encountered in format string

Я пытался:

return '{id=%d, title=%s, Ip=%s}'%(self.id,self.title.encode('utf-8'),self.user_ip.encode('utf-8'))

и я получил:

TypeError: {id=8126, title=1 בדצמבר, Ip=147.237.70.106} is not JSON serializable

добавление "" вокруг (в соответствии с форматированием JSON) следующим образом: "id"="%d", "title"="%s", "Ip"="%s" тоже не помогло.

Я знаю, это должно быть очень просто, но я просто не могу понять это правильно

фактически бутылка автоматически обрабатывает часть jsonification, но попытка вызвать json.dumps для результата дает мне те же ошибки.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

Вместо того, чтобы пытаться преобразовать в json строку, вы можете определить, например, свой собственный метод to_dict, который возвращает структуру словаря, которую вы, похоже, пытаетесь создать, и после этого генерировать json из этой структуры:

>>> import json
>>> d = {'id':8126, 'title':u'1 בדצמבר', 'ip':'147.237.70.106'}
>>> json.dumps(d)
'{"ip": "147.237.70.106", "id": 8126, "title": "1 \\u05d1\\u05d3\\u05e6\\u05de\\u05d1\\u05e8"}'
1 голос
/ 22 февраля 2012

Я не уверен, что понимаю, что вы пытались.Не могли бы вы построить dict и позволить json.dumps() сделать работу за вас?

Что-то вроде:

>>> class Foo:
...     id = 1
...     title = 'my title'
...     to_jsonize = ['id', 'title']
>>>
>>> dct = {name: getattr(Foo,name) for name in Foo.to_jsonize}
>>> import json
>>> json.dumps(dct)
'{"id": 1, "title": "my title"}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...