【问题标题】:Iterate Python dict convert Mongo ObjectId into string if value is ObjectId如果值为 ObjectId,则迭代 Python dict 将 Mongo ObjectId 转换为字符串
【发布时间】:2015-12-17 04:32:59
【问题描述】:

这是我的 dict 结构,我无法迭代整个 dict 以找到 ObjectId 作为值 我的输入数据:

 {
"_id" : ObjectId("5671947d29c23846797d836a"),
"event_version" : "1.0",
"event_time" : ISODate("2015-12-16T16:42:37.501Z"),
"event_name" : "Create_Assignment",
"user_id" : "admin",
"tenant" : "Demo_Tenant",
"sourceIPAddress" : "",
"user_agent" : "",
"request_parameters" : {
    "username" : "admin",
    "status" : "active",
    "first_name" : "",
    "last_name" : "",
    "is_deleted" : false,
    "updated_by" : "admin",
    "roles" : [ 
        {
            "_ref" : {
                "$ref" : "role",
                "$id" : ObjectId("5671947d29c23846797d8362")
            },
            "_cls" : "Role"
        }, 
        {
            "_ref" : {
                "$ref" : "role",
                "$id" : ObjectId("5671947d29c23846797d8366")
            },
            "_cls" : "Role"
        }
    ]

}

我试过了:

def todict(self, data, obj=None):
    for key in data:
        if isinstance(data[key], (ObjectId)):
            print '>>>>>>>>>>', data[key]
            obj[key]=str(data[key])
        else:
            if not isinstance(data[key], (str, unicode, list, datetime, bool)):
                self.todict(data[key],obj)
            else:
                obj[key]=data[key]
    return obj

但这不能正常工作。我需要递归函数将所有 ObjectID 值转换为 str

预期的 JSON:

 {
"_id" : "5671947d29c23846797d836a",
"event_version" : "1.0",
"event_time" : ISODate("2015-12-16T16:42:37.501Z"),
"event_name" : "Create_Assignment",
"user_id" : "admin",
"tenant" : "Demo_Tenant",
"sourceIPAddress" : "",
"user_agent" : "",
"request_parameters" : {
    "username" : "admin",
    "status" : "active",
    "first_name" : "",
    "last_name" : "",
    "is_deleted" : false,
    "updated_by" : "admin",
    "roles" : [ 
        {
            "_ref" : {
                "$ref" : "role",
                "$id" : "5671947d29c23846797d8362"
            },
            "_cls" : "Role"
        }, 
        {
            "_ref" : {
                "$ref" : "role",
                "$id" : "5671947d29c23846797d8366"
            },
            "_cls" : "Role"
        }
    ]

}

【问题讨论】:

    标签: python mongodb dictionary mongoengine flask-mongoengine


    【解决方案1】:

    永远不会太晚,希望这对某人有所帮助......

    from bson import ObjectId
    
    # convert recursively all ObjectIds to strings in a dictionary
    def obj_to_str(data):
        if isinstance(data, dict):
            return {obj_to_str(key): obj_to_str(value) for key, value in data.items()}
        elif isinstance(data, list):
            return [obj_to_str(element) for element in data]
        elif isinstance(data, ObjectId):
            return str(data)
        else:
            return data
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

    你可以试试这个:

    ...
    from bson import ObjectId
    
    ...
    def todict(self, data, obj=None):
        for key in data:
            if isinstance(data[key], ObjectId):
                obj[key]=str(data[key])
    ... ...
    

    【讨论】:

    • 这是在 ubuntu14.04、python2.7.6、pymongo 2.9 上测试的,它可以工作。
    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 2016-09-25
    • 1970-01-01
    • 2014-12-08
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多