轻松地在json之间序列化数据类

serious的Python项目详细描述


严重

PyPIBuild StatusTest CoverageSupported PythonDocumentation

数据类模型工具包:序列化、验证等。

Documentation

功能

  • 纯python中的模型定义。
  • 验证显示在代码覆盖率中。
  • 所有面向公共的api的类型注释。
  • (可选)确保不变性。
  • 易于扩展。
  • 为人们而生。
  • 严格记录。

基本知识

安装

可从PyPI

pip install serious

快速示例

严肃api的中心部分是不同的Models

给定一个常规数据类:

fromdataclassesimportdataclass@dataclassclassPerson:name:str

让我们创建一个JsonModel

fromserious.jsonimportJsonModelmodel=JsonModel(Person)

使用它的dump/load methods

person=Person('Albert Einstein')model.dump(person)# {"name": "Albert Einstein"}

验证

要将验证添加到上面的示例中,我们需要将__validate__方法添加到person:

fromdataclassesimportdataclassfromtypingimportOptionalfromseriousimportValidationError,Email@dataclassclassPerson:name:stremail:Optional[Email]phone:Optional[str]def__validate__(self):iflen(self.name)==0:raiseValidationError('Every person needs a name')ifself.phoneisNoneandself.emailisNone:raiseValidationError('At least some contact should be present')

More on validation.

支持的格式:

支持的字段类型

More in docs.

  • 其他数据类
  • 原语:strintfloatbool
  • 字典:仅使用字符串键:Dict[str, Any]
  • 列表,setsdeques:任何可序列化类型的python集合
  • Tuples有无省略:
    • 元组作为独立元素集(例如Tuple[str, int, date]
    • 使用省略号,充当冻结列表(Tuple[str, ...]
  • Enumerations按值:
    • 原语(例如OperatingSystem(Enum)
    • 类型化枚举(Color(str, Enum)FilePermission(IntFlag)
  • Decimal:作为字符串编码为json
  • Datetimedatetime:编码为ISO 8601格式的字符串
  • UUID
  • serious.types.Timestamp:自UNIX epoch起作为浮点ms值的UTC时间戳
  • serious.types.Email:支持验证并包含其他属性的字符串小型类型
  • serious.typesFrozenListFrozenDict

一个更大的例子

fromdataclassesimportdataclassfromseriousimportJsonModel,ValidationErrorfromtypingimportListfromenumimportEnumclassSpecialty(Enum):Worker=1Fool=2@dataclass(frozen=True)classMinion:name:strtype:Specialty@dataclass(frozen=True)classBoss:name:strminions:List[Minion]def__validate__(self):iflen(self.minions)<2:raiseValidationError('What kind of boss are you?')boss=Boss("me",[Minion('evil minion',Specialty.Fool),Minion('very evil minion',Specialty.Worker)])boss_json="""{    "name": "me",    "minions": [        {            "name": "evil minion",            "type": 2        },        {            "name": "very evil minion",            "type": 1        }    ]}"""model=JsonModel(Boss,indent=4)assertmodel.dump(boss)==boss_jsonassertmodel.load(boss_json)==boss

致谢

最初是@lidatong/dataclasses-json的叉。

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

推荐PyPI第三方库


热门话题
java有没有工具可以将zephyr转换为velocity模板?   java在安卓 studio中从JSON响应中获取值   jvm如何在Java中设计一个好的permgen空间字符串?   java如何防止Rest webservice使用被盗令牌进行身份验证   java无法遍历列表JSTL   找不到用于ResourceServerTokenServices的java Bean SpringSecurityOauth2   java子字符串替换问题   爪哇玻璃鱼3。十、 以编程方式处理任意HTTPSession的终止   java如何检查输入是否为整数,并在最后添加一个命令来重新启动while循环?   引发java ical4j 1.0.6不可解析日期异常   Java等价于Delphi的DBCtrlGrid?   如果发生错误,java将查找下一个预期标记ANTLR 3   java自打开应用程序(创建锁屏)   java为什么netty有自己的ConcurrentHashMap?   Gradle任务中的java拉取和运行依赖项   继承与Java继承的混淆   java使用shell脚本中的版本执行jar   java我无法让Sqlite数据库与带有Maven的JavaFX应用程序IDE Eclipse包正确通信   java控制台日志未通过org打印。阿帕奇。hadoop。mapreduce。作业的waitForCompletion(true)方法   JAVAlang.NoSuchMethodError:apachestorm螺栓中的spring getrequest