【问题标题】:json serialize python and mongoengine object mixjson序列化python和mongoengine对象混合
【发布时间】:2014-12-01 20:40:17
【问题描述】:

json.dumps(o) 将原生 python 对象转换为 json
o.to_json()mongoengine 对象(例如 Document)转换为 json

如何转换混合对象?
例如 python dict,以 mongoengine 对象作为其值?

有这方面的工具吗?或者我应该创建一个自定义的JSONEncoder 类?

如果我确实覆盖了编码器,我可以创建一个解码器来重建 mongoengine 对象吗?

【问题讨论】:

    标签: python json serialization deserialization mongoengine


    【解决方案1】:

    以下编码器序列化 python\mongoengine 对象混合

    import json
    from mongoengine.base import BaseDocument
    
    class MongoengineObjectsJsonEncoder(json.JSONEncoder):
        def default(self, o):
            if isinstance(o, BaseDocument):
                return o._data
            elif isinstance(o, datetime):
                return o.isoformat()
            else:
                return json.JSONEncoder.default(self, o)
    

    注意事项:

    • 此编码器没有添加任何关于 python 位置的签名 对象结束和 mongoengine 对象开始,所以它不能 自动正确反序列化为 python\mongoengine 对象, 而是它将反序列化为单个 python 对象
    • 我还添加了datetime 对象序列化为 ISO 8601 格式

    【讨论】:

    • 那不行,默认的 json 编码器不能正确处理 mongo 的数据类型,因为 bson 是 json 的超类型。 MongoEngine 仅使用 pymongo(参见 bson.json_utils)来编码单个对象或查询集,因此您应该将其用于文档,例如:return json_utils.dumps(o.to_mongo())
    • @Ross - 你的意思是而不是特定行 return o._data
    • @Ross - 假设上述评论是肯定的,AFAIK 如果 default() 返回 str 而不是 dict 然后在解码的后期整个对象将保留为字符串,所以也许你的意思是return o.to_mongo()
    • @Ross 回答我上面的问题 :)
    • 我通过 from bson.json_util import dumps 解决了我的问题,最后返回 dumps(o)
    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2010-11-30
    • 1970-01-01
    • 2017-09-03
    • 2018-11-15
    相关资源
    最近更新 更多