mongoengine的更可读的json序列化程序/反序列化程序

mongoengine-goodjson的Python项目详细描述


用于MongoEngine的更可读的JSON序列化程序/反序列化程序

Build StatusTest CoverageMaintainabilityDocumentation Status Image

这是什么?

此脚本使mongoengine文档json序列化更加自然。

为什么发明这个?

使用mongoengine创建一些东西(例如restful api),有时 可能希望将数据库中的数据序列化为json,但有些字段 很奇怪,不适合前端/api:

{"_id":{"$oid":"5700c32a1cbd5856815051ce"},"name":"Hiroaki Yamamoto","registered_date":{"$date":1459667811724}}

两点:

  • _id可能不需要,因为jslint不同意_字符,除非 声明jslint nomen:true
  • $oid$date这样的子字段。这些领域被称为 MongoDB Extended JSON。但是,考虑到Mongoengine是ODM和 因此它有模式定义方法,字段不应该有 特殊领域。特别是在某些问题上,你可能会 No such property $oid of undefined处理上面生成的 前端数据。

要解决这些问题,生成的数据应该如下:

{"id":"5700c32a1cbd5856815051ce","name":"Hiroaki Yamamoto","registered_date":1459667811724}

通过重新映射可以实现上述结构,但是如果我们在 API's controller object,代码可能会变得超级脏:

"""Dirty code."""importmongoengineasdbclassUser(db.Document):"""User class."""name=db.StringField(required=True,unique=True)registered_date=db.DateTimeField()defget_user(self):"""Get user."""models=[{("id"ifkey=="_id"elsekey):(value.pop("$oid")if"$oid"invalueandisinstance(value,dict)elsevalue.pop("$date")if"$date"invalueandisinstance(value,dict)elsevalue#What if there are the special fields in child dict?)for(key,value)indoc.items()}fordocinUser.objects(pk=ObjectId("5700c32a1cbd5856815051ce"))]returnjson.dumps(models,indent=2)

为了解决这个问题,我开发了这个scirpt。用这个 脚本,您不需要进行上述转换。即

"""A little-bit clean code."""importmongoengineasdbimportmongoengine_goodjsonasgjclassUser(gj.Document):"""User class."""name=db.StringField(required=True,unique=True)registered_date=db.DateTimeField()defget_user(self):"""Get user."""returnmodel_cls.objects(pk=ObjectId("5700c32a1cbd5856815051ce")).to_json(indent=2)

如何使用

通常您可以像往常一样定义文档,但您可能希望继承 mongoengine_goodjson.Documentmongoengine_goodjson.EmbeddedDocument

下面是示例:

"""Example schema."""importmongoengine_goodjsonasgjimportmongoengineasdbclassAddress(gj.EmbeddedDocument):"""Address schema."""street=db.StringField()city=db.StringField()state=db.StringField()classUser(gj.Document):"""User data schema."""name=db.StringField()email=db.EmailField()address=db.EmbeddedDocumentListField(Address)

更多细节…医生来了!

如果你想知道更多,你需要阅读read the doc。 你现在可以喝杯咖啡了!!

贡献

详情请read the doc

许可证(麻省理工学院许可证)

LICENSE.md

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在MATLAB中生成java格式的矩阵   java混合图片,颜色为白色   java Apache Tomcat 7域问题代理设置   java无法从资产中读取csv文件   java为SpringFramework 5中的所有控制器和方法指定一个模式   java为我的应用程序打开html帮助页面   java中的条件语句。属性文件   数组Java彩票类   javascript允许Rhino使用当前项目中的Java类   java无法将ModelMap添加到会话   Java执行命令行程序   java这个电子邮件程序是如何工作的?   java自定义listview,视图问题   java将变量从JavaFx传递到JavaScript&编写代码来触发按钮   java从csv文件中删除记录   爪哇移动蝙蝠。重新油漆   socketjava断开连接   已解析页面的java HTML