1

当我选择数据库时,我将 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}

你对这项工作有更好的想法吗?

4

2 回答 2

0

这不是jsonpickle目的。picklejsonpickle用于将任意 Python 对象序列化为某种格式,以便以后可以将其反序列化为完全相同的 Python 对象。它们不用于根据特定模式对对象进行序列化。

对于您的情况,您必须自己编写序列化逻辑。例子:

obj = lst[0]
serialized_obj = {k: getattr(obj, k) for k in ["name", "fullname", "password", "id"]}

您还必须处理任何特殊类型。您甚至可以花哨并尝试自动反映模型上的列。

顺便说一句,我看到的密码是明文存储的吗?

于 2016-03-01T08:22:16.680 回答
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

于 2018-07-30T21:43:40.057 回答