从数据类生成JSON模式

dataclasses-jsonschema-rereleased的Python项目详细描述


从Python3.7数据类生成JSON模式的库。python3.6通过dataclasses backport得到支持。旨在成为类似项目(如marshmallow&;pydantic)的更轻量级替代方案。在

功能概述

  • 支持draft-04、draft-06、Swagger 2.0和OpenAPI 3模式类型
  • 序列化和反序列化
  • 根据生成的架构进行数据验证
  • APISpec支持。示例below

安装

~$ pip install dataclasses-jsonschema

要使用fastjsonschema改进验证性能,请安装:

^{pr2}$

示例

fromdataclassesimportdataclassfromdataclasses_jsonschemaimportJsonSchemaMixin@dataclassclassPoint(JsonSchemaMixin):"A 2D point"x:floaty:float

模式生成

>>>pprint(Point.json_schema()){'description':'A 2D point','type':'object','properties':{'x':{'format':'float','type':'number'},'y':{'format':'float','type':'number'}},'required':['x','y']}

数据序列化

>>>Point(x=3.5,y=10.1).to_dict(){'x':3.5,'y':10.1}

反序列化

>>>Point.from_dict({'x':3.14,'y':1.5})Point(x=3.14,y=1.5)>>>Point.from_dict({'x':3.14,y:'wrong'})dataclasses_jsonschema.ValidationError:'wrong'isnotoftype'number'

生成多个模式

fromdataclasses_jsonschemaimportJsonSchemaMixin,SchemaType@dataclassclassAddress(JsonSchemaMixin):"""Postal Address"""building:strstreet:strcity:str@dataclassclassCompany(JsonSchemaMixin):"""Company Details"""name:straddress:Address>>>pprint(JsonSchemaMixin.all_json_schemas(schema_type=SchemaType.SWAGGER_V3)){'Address':{'description':'Postal Address','properties':{'building':{'type':'string'},'city':{'type':'string'},'street':{'type':'string'}},'required':['building','street','city'],'type':'object'},'Company':{'description':'Company Details','properties':{'address':{'$ref':'#/components/schemas/Address'},'name':{'type':'string'}},'required':['name','address'],'type':'object'}}

使用NewType

fromdataclasses_jsonschemaimportJsonSchemaMixin,FieldEncoderPhoneNumber=NewType('PhoneNumber',str)classPhoneNumberField(FieldEncoder):@propertydefjson_schema(self):return{'type':'string','pattern':r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$'}JsonSchemaMixin.register_field_encoders({PhoneNumber:PhoneNumberField()})@dataclassclassPerson(JsonSchemaMixin):name:strphone_number:PhoneNumber

更多示例see the tests

APISpec插件

v2.5.0中的新功能

可以使用apispec插件生成OpenAPI和Swagger规范:

fromtypingimportOptional,ListfromdataclassesimportdataclassfromapispecimportAPISpecfromapispec_webframeworks.flaskimportFlaskPluginfromflaskimportFlask,jsonifyimportpytestfromdataclasses_jsonschema.apispecimportDataclassesPluginfromdataclasses_jsonschemaimportJsonSchemaMixin# Create an APISpecspec=APISpec(title="Swagger Petstore",version="1.0.0",openapi_version="3.0.2",plugins=[FlaskPlugin(),DataclassesPlugin()],)@dataclassclassCategory(JsonSchemaMixin):"""Pet category"""name:strid:Optional[int]@dataclassclassPet(JsonSchemaMixin):"""A pet"""categories:List[Category]name:strapp=Flask(__name__)@app.route("/random")defrandom_pet():"""A cute furry animal endpoint.
    ---
    get:
      description: Get a random pet
      responses:
        200:
          content:
            application/json:
              schema:
                $ref: Pet
    """pet=get_random_pet()returnjsonify(pet.to_dict())# Dependant schemas (e.g. 'Category') are added automaticallyspec.components.schema("Pet",schema=Pet)withapp.test_request_context():spec.path(view=random_pet)

托多

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

推荐PyPI第三方库


热门话题
java为什么会出现这些错误?表达式的非法开始   使用HttpUrlConnection的java测试URL仅适用于前面的www   在大数据集上使用kmeans的java堆外内存   查找Java RandomAccessFile如何以字符形式读取第n个字节   java Android从BroadcastReceiver获取标题和描述   java使用构造函数参数模拟嵌套类并测试方法   正在将Azure Blob项强制转换为Java文件对象   java并行运行testNG套件   java程序在运行时似乎没有进入   贬低Java规则引擎的优点和缺点   文本区域中的java中心文本   java JPA从多个表中选择错误   类Java问题使用类加载器重新加载代码   java如何在Spring非管理类上使用@Value   java(关闭)Gradle导入VS代码失败   java arraylist拆分(“空白”)并计算字数   Android/Java如何在单独的*中调用函数。java文件?   具有基本身份验证的java Apache Camel RSS模块   java为什么程序在出现溢出或下溢时不抛出异常