轻松地在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第三方库


热门话题
当JUnit测试失败时,java会显示一条用户友好的消息   java着色器不渲染到窗口   java CXF DOSGi正在忽略注释   我想把这行JAVA改成kotlin   java如果我想在ArrayQue中提供null,我该怎么做   java如何在Springboot中为线程调度命名   java如何将使用者<String>传递给方法   java如何在GWT中检查正则表达式的时间戳?   将Mongodb与Java连接时,在类路径上找不到SLF4J   使用Java创建数组数组   java Hibernate获取对象并另存为外键   java应用程序在打开活动时崩溃   java如何从AlarmManager BroadcastReceiver调用MainActivity方法?   Executor服务中的java不确定任务   JavaSpringMVC本地主机工作应用程序在Heroku部署后返回错误404   当精灵与加速计一起旋转时,java将精灵弹离墙壁   Java:可以创建一个带有“变量”字段的类吗?   java OpenGL空指针异常   使用servlet登录facebook时出现java错误   Android Studio中的java Junit