将JSON模式转换为python类

JD *_*ite 26 python json jsonschema

是否有用于将JSON模式转换为python类定义的python库,类似于jsonschema2pojo - https://github.com/joelittlejohn/jsonschema2pojo - for Java?

syn*_*tel 23

到目前为止,我能找到的最接近的是warlock,它宣传了这个工作流程:

构建您的架构

>>> schema = {
    'name': 'Country',
    'properties': {
        'name': {'type': 'string'},
        'abbreviation': {'type': 'string'},
    },
    'additionalProperties': False,
}
Run Code Online (Sandbox Code Playgroud)

创建一个模型

>>> import warlock
>>> Country = warlock.model_factory(schema)
Run Code Online (Sandbox Code Playgroud)

使用模型创建对象

>>> sweden = Country(name='Sweden', abbreviation='SE')
Run Code Online (Sandbox Code Playgroud)

然而,它并不那么容易.术士所产生的物品在引人入胜的物品方面缺乏很多东西.如果它在初始化时支持嵌套的dicts,我无法弄清楚如何使它们工作.

为了给出一点背景知识,我正在研究的问题是如何使用Chrome的JSONSchema API并生成请求生成器和响应处理程序树.术士似乎并没有太远,唯一的缺点是Python中的元类不能真正转变为"代码".

寻找其他有用的模块:

如果您最终找到一个良好的一站式解决方案,请跟进您的问题 - 我很乐意找到一个.我倾注了github,pypi,googlecode,sourceforge等等.而且找不到任何真正性感的东西.

由于缺乏任何预先制定的解决方案,我可能会自己和Warlock一起拼凑一些东西.所以,如果我打败你,我会更新我的答案.:p


iga*_*rav 14

python-jsonschema-objects是术士的替代品,构建于jsonschema之上

python-jsonschema-objects提供了一个基于类的自动绑定到JSON模式,以便在python中使用.

用法:

示例Json Schema

schema = '''{
    "title": "Example Schema",
    "type": "object",
    "properties": {
        "firstName": {
            "type": "string"
        },
        "lastName": {
            "type": "string"
        },
        "age": {
            "description": "Age in years",
            "type": "integer",
            "minimum": 0
        },
        "dogs": {
            "type": "array",
            "items": {"type": "string"},
            "maxItems": 4
        },
        "gender": {
            "type": "string",
            "enum": ["male", "female"]
        },
        "deceased": {
            "enum": ["yes", "no", 1, 0, "true", "false"]
            }
    },
    "required": ["firstName", "lastName"]
} '''
Run Code Online (Sandbox Code Playgroud)

将架构对象转换为类

 import python_jsonschema_objects as pjs
 import json
 schema = json.loads(schema)   
 builder = pjs.ObjectBuilder(schema)   
 ns = builder.build_classes()   
 Person = ns.ExampleSchema   
 james = Person(firstName="James", lastName="Bond")   
 james.lastName  
  u'Bond'  james      
 example_schema lastName=Bond age=None firstName=James  
Run Code Online (Sandbox Code Playgroud)

验证:

james.age = -2 python_jsonschema_objects.validators.ValidationError:-2小于或等于0

但问题是,它仍在使用draft4validation,而jsonschema已经移动了draft4validation,我在repo上就此提出了一个问题.除非您使用旧版本的jsonschema,否则上述包将如图所示工作.


Hed*_*can 6

datamodel-code-generator是一个 cli 代码生成器,可以从包括 JSON 模式在内的各种来源构建pydantic模型和dataclasses.dataclass 。

在撰写本文时,根据 GitHub 的数据,它比其他答案中的库拥有更多的用户

从 json 模式生成 python 数据类的示例用法:

datamodel-codegen --input ./<your-data-here>.json --input-file-type jsonschema --output <your-data-here>.py --output-model-type dataclasses.dataclass
Run Code Online (Sandbox Code Playgroud)