当我选择数据库时,我使用jsonpickle作为序列化程序,我将使用jsonpickle将列表对象转换为json,我得到此输出:
代码:
Session = sessionmaker(bind=connect.ConnectorMySql())
ses = Session()
lst = ses.query(pModel).all()
return lst
jsonpickle:
serialized_obj = jsonpickle.encode(lst[0])
输出:
{"py/object": "Models.UserModel.", "sa_instance_state": {"py/object": "sqlalchemy.orm.state.InstanceState", "py/state": {"instance": {"py/id": 0}, "committed_state": {}, "class": {"py/type": "Models.UserModel."}, "manager": {"py/object": "sqlalchemy.orm.instrumentation.SerializeManager", "class": {"py/type": "Models.UserModel.Student"}}, "key": {"py/tuple": [{"py/type": "Models.UserModel.Student"}, {"py/tuple": [1]}]}, "expired_attributes": {"py/set": []}}}, "name": "ramin", "fullname": "eee", "password": "1234345", "id": 1}
但我需要这种格式json:
{"name": "ramin", "fullname": "eee", "password": "1234345", "id": 1}
你对这项工作有更好的想法吗?
答案 0 :(得分:0)
这不是jsonpickle
的用途。 pickle
和jsonpickle
用于将任意Python对象序列化为某种格式,以便以后可以将其反序列化为完全相同的Python对象。它们不用于根据特定模式对对象进行序列化。
对于您的情况,您必须自己编写序列化逻辑。例如:
obj = lst[0]
serialized_obj = {k: getattr(obj, k) for k in ["name", "fullname", "password", "id"]}
您还必须处理任何特殊类型。您甚至可以想象并尝试自动反映模型中的列。
顺便问一下,我看到以明文形式存储的密码吗?
答案 1 :(得分:0)
尝试如下在SQLAlchemy对象上定义__getstate__
和__setstate__
def __getstate__(self):
state = {}
for k, v in self.__dict__.items():
if k != '_sa_instance_state':
state[k] = v
return state
def __setstate__(self, d):
self.__dict__ = d
jsonpickle将使用它们来腌制/去渍,如果我理解正确的话,您将不会存储_sa_instance_state
,这是内部记账的内容。
此处有一些相关信息:http://docs.sqlalchemy.org/en/latest/orm/extensions/mutable.html#supporting-pickling