Python Sql Alchemy - 如何将从数据库查询中得到的类对象结果转换为Json格式

6

基本上,我只想将我的SQL查询结果以JSON编码。

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

这是打印vars(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'}

你需要对结果进行序列化操作。可以参考这个答案:https://dev59.com/E2w05IYBdhLWcg3wqzms?rq=1 - codegeek
http://marshmallow-sqlalchemy.readthedocs.io/en/latest/ - Foo L
将对象序列化为 JSON,这是我的解决方案:https://stackoverflow.com/questions/20171690/how-to-jsonify-objects-from-sqlalchemy/53519960#53519960 - NicoNing
3个回答

5
您可以使用 Marshmallow。以下是示例。在您的main.py文件旁边定义一个serializer.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

4
这是一个关于 Marshmallow 1.0 的最新摘要:https://gist.github.com/sloria/aecc540db3a95fbbee2f - Steve L

1

0

我假设你的class User中的变量'_updated''_created'是DateTime类型。DateTime在jsonify中无法序列化。你可以将datetime变量转换为str。例如,str(some_date_in_datetimeformat)可能有效。
此外,'_sa_instance_state'是sqlalchemy.orm.state.InstanceState类型,应该可序列化。

更新:

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 
        }

然后在您想要将数据转换为 JSON 格式的地方,只需调用该函数即可。

jsonify(x.serialize())

我试图删除包含日期时间字段的属性,但您建议的方法无效。 results = db.session.query(User).filter_by(username=request.form['username'], password=request.form['password']).first() del results._created del results._updated print vars(results) return jsonify(results = results) - olleh
我更新了我的回答。这是 jsonify 常见的问题,在 stackoverflow 上以前已经有过回答(请看 codegeek 对你问题的评论)。 - Nitin Nain

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