【问题标题】:Python Object of type Binary is not JSON serializable二进制类型的 Python 对象不是 JSON 可序列化的
【发布时间】:2022-09-28 01:42:30
【问题描述】:

我正在尝试使用MongoClient 从某些线程的MongoDB port 中提取数据。但是,当writingJSON 文件时出现错误。我认为传入的data 中有一个Binary 数据类型。如何修复此错误?

我的代码:

import json
import pymongo as pymongo


def get_ip_data():
    db_datas = []
    for ip_line in json_data:
        try:
            replace_ip = ip_line.replace(\"\\n\", \"\")
            client = pymongo.MongoClient(replace_ip, 27017)
            client.server_info()

            db_names = client.list_database_names()
            list_collections = client.admin.command({\'listCollections\': 1.0}, {\'authorizedCollections\': True})
            host_info = client.admin.command({\'hostInfo\': 1})
            server_status = client.admin.command({\'serverStatus\': 1})
            lock_info = client.admin.command({\'lockInfo\': 1})
            build_info = client.admin.command({\'buildInfo\': 1})

            db_data = {f\"{ip_line}, db_names\": db_names, \"collections_list\": list_collections,
                       \"server_status\": server_status, \"host_info\": host_info, \"lock_info\": lock_info,
                       \"build_info\": build_info}
            db_datas.append(db_data)

        except Exception as e:
            print(e)

        finally:
            with open(\"./data.json\", \"wt\") as write_data:
                write_data.write(json.dumps(db_datas, indent=4))


if __name__ == \"__main__\":
    with open(\"./ip_list.txt\", \"r\") as json_data:
        json_data = json_data.readlines()

    get_ip_data()

    标签: python json mongodb port json-serializable


    【解决方案1】:

    解决方案取决于您希望在结果中得到什么

    推荐的方法是使用 pymongo 的 bson.json_util 将带有 bson 类型对象的字典正确转储到 json。在这种情况下,它们将被表示为类似的东西

    "your_binary_field": {
        "$binary": {
            "base64": "Xi6aRRv9SWAJtTK4ScAoKDrw4cU5bek=",
            "subType": "00"
        }
    },
    

    bson 包可以正确读取它。

    或者,您可以递归地遍历您的 db_datas 项目,并将所有 bson.Binary 对象转换为字符串或其他 json-serializable 值,例如,使用 bson.Binary.decode。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-05
      • 2021-04-29
      • 2018-11-27
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2021-12-24
      相关资源
      最近更新 更多