将SQLAlchemy类序列化为JSON。

3
我将尝试将 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"也没有帮助。

我知道这应该很简单,但我就是做不好这个。

实际上,Bottle会自动处理JSON化部分,但尝试在结果上调用json.dumps也会给出相同的错误。

2个回答

3

不要尝试将字符串转换为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

我不确定我理解你尝试的内容。你不能构建一个 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"}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接