基本上,我只想对json编码我的sql查询结果。
x = db.session.query(User).filter_by(username = request.form['username'], password = request.form['password']).first()
print vars(x)
return jsonify(x)
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: < User WashingtonGeorge> is not JSON serializable
以下是打印变量(x)的结果
{'_updated': None, 'username': u'WashingtonGeorge', 'password': u'Washington', '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7fd12a50c8d0>, 'firstname': u'George', 'lastname': u'Washington', '_created': None, 'fullname': u'George Washington', '_id': 1, 'email': u'WashingtonGeorge@yahoo.com'}
答案 0 :(得分:5)
你可以使用marshallow。这是一个例子。定义serializer.py
并将其放在main.py
文件旁边,然后:
serializer.py
中的
from marshmallow import Serializer
###### USER SERIALIZER #####
class UserSerializer(Serializer):
class Meta:
# Fields to expose
fields = ('username')
# you can add any other member of class user in fields
#Return the user data in json format
def get_user_serialized(user):
return UserSerializer(user).data
在main.py
from .serializers import get_user_serialized
...
...
...
x = db.session.query(User).filter_by(username = request.form['username'], password = request.form['password']).first()
serialized = [get_user_serialized(item) for item in x]
res = jsonify(res=serialized)
return res
答案 1 :(得分:1)
使用JSON序列化,您可以做到这一点。
看看这个:http://prschmid.blogspot.com/2012/12/json-serializing-sqlalchemy-objects.html
它对我有用
答案 2 :(得分:0)
我假设变量'_updated'
&amp; '_created'
中的class User
类型为DateTime。日期时间在jsonify中不可用。您可以将datetime变量转换为str。即str(some_date_in_datetimeformat)可能有效。
此外,sqlalchemy.orm.state.InstanceState类型的'_sa_instance_state'
应该是可序列化的。
<强>更新强>
jsonify无法序列化您的对象。最好的解决方案是在类中定义一个函数serialize()并使用它来使数据可序列化。所以你的班级变成了,
class User(object):
def serialize():
return {
'_id': 1,
'username': u'WashingtonGeorge'
'fullname': u'George Washington'
# other fields that you need in the json
}
然后在你想要jsonify数据的地方,只需要调用。
jsonify(x.serialize())