【问题标题】:JSON decoder for Flask+PyMongoFlask+PyMongo 的 JSON 解码器
【发布时间】:2020-07-21 18:47:48
【问题描述】:

我有使用 MongoDB 的 Flask 应用程序。我在编码 ObjectId、datetime 和 date 对象时遇到了问题,但是用这个 https://stackoverflow.com/a/51773611/9472066 答案解决了它们 - 自定义编码器有效。但是,我不知道如何为 PyMongo 编写解码器:我如何知道字符串是 ObjectId、datetime 还是其他?我是否必须在解码器方法中手动检查格式,然后调用适当的构造函数?或者有没有更智能、更自动化的方法?

【问题讨论】:

  • 您的数据来自哪里?
  • @BellyBuster 从我自己的序列化到数据库。确切地说,前端传递 JSON,我从它们创建对象,对其进行一堆业务逻辑操作,然后将它们序列化到数据库。稍后我想从数据库中获取它们。所以我对 JSON 进行了序列化和反序列化。文档和对象很复杂(嵌入文档、自定义对象列表等),所以我需要编码器和解码器,例如。 G。用于 ObjectID 类型。

标签: python json flask pymongo


【解决方案1】:

我强烈建议您使用原生 python 类型,因为 pymongo 将在创建适当类型方面完成所有繁重的工作。

认为 MongoDB 是一个 JSON 数据库是错误的,认为必须使用 JSON 才能将数据输入和输出是一个更大的错误。

如果你真的想这样做,试试bson.json_util 模块:

import pymongo
import bson.json_util

db = pymongo.MongoClient()["mydatabase"]

db.mycollection.insert_one({'a': 'a'})
json_str = bson.json_util.dumps(db.mycollection.find_one({'a': 'a'}))
json_dict = json.loads(json_str)
json_dict['a'] = 'b'
json_str = json.dumps(json_dict)
db.newcollection.insert_one(bson.json_util.loads(json_str))
print(list(db.newcollection.find({})))

但我更愿意在本地执行此操作:

db.mycollection.insert_one({'a': 'a'})
record = db.mycollection.find_one({'a': 'a'})
record['a'] = 'b'
db.newcollection.insert_one(record)
print(list(db.newcollection.find({})))

【讨论】:

  • 在我的案例中,第二种方法的问题是我有相当复杂的业务逻辑来处理数据库中的数据。例如,我使用一堆方法和依赖项创建 User 类对象,我必须将其保存到数据库中,然后加载数据并从中创建 User 对象。同时,我不想(现有的 API 可能不能)使用 PyMODM 和它的字段类型,如 StringField。在我的情况下,在直接 dicts 上完成所有工作会非常困难,所以我想使用自定义类,AFAIK 需要编码器和解码器。
  • 您可以使用类的内置 dict 属性来获取任何类对象的字典表示。相信我,您将避免对 JSON 进行酸洗和拆解的痛苦世界。
  • 您如何看待这种轻微的解决方法:包含 JSON 的类,以及用于 JSON 访问和业务逻辑的方法?如果我使用嵌入的 JSON,那将适用于您的第二个代码?
  • 这听起来很明智。
  • 我之前引用的dict 属性应该是__dict__。默认格式化程序没有正确显示。
猜你喜欢
  • 2018-02-27
  • 2015-05-25
  • 2015-03-30
  • 2016-05-05
  • 2016-06-05
  • 2015-12-08
  • 2014-06-03
  • 2015-04-17
  • 2015-02-25
相关资源
最近更新 更多