将 JSON 模式转换为 python 类

Posted

技术标签:

【中文标题】将 JSON 模式转换为 python 类【英文标题】:Convert a JSON schema to a python class 【发布时间】:2012-09-10 01:01:47 【问题描述】:

是否有用于定义的 python 库,类似于 jsonschema2pojo -- https://github.com/joelittlejohn/jsonschema2pojo -- for Java?

【问题讨论】:

您能否详细说明为什么json 标准库模块的功能不足以满足您的需求,而您需要生成的类定义? 您的评论的答案非常简单 - 使用原始字典是二等对象管理,大多数人不喜欢 JSON 提供的花括号霰弹枪。 【参考方案1】:

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

构建您的架构

>>> schema = 
    'name': 'Country',
    'properties': 
        'name': 'type': 'string',
        'abbreviation': 'type': 'string',
    ,
    'additionalProperties': False,

创建模型

>>> import warlock
>>> Country = warlock.model_factory(schema)

使用您的模型创建对象

>>> sweden = Country(name='Sweden', abbreviation='SE')

然而,这并不那么容易。术士生产的物品缺乏内省的好东西。如果它在初始化时支持嵌套字典,我无法弄清楚如何让它们工作。

为了提供一点背景知识,我正在研究的问题是如何获取 Chrome's JSONSchema API 并生成请求生成器和响应处理程序树。 Warlock 似乎并没有太离谱,唯一的缺点是 Python 中的元类不能真正变成“代码”。

寻找其他有用的模块:

jsonschema - (术士建立在其之上) valideer - 类似于 jsonschema,但名称更差。 bunch - 一个有趣的结构构建器,介于 a dotdict 和 construct 之间

如果您最终找到了一个好的一站式解决方案,请跟进您的问题 - 我很想找到一个。我翻遍了 github、pypi、googlecode、sourceforge 等。但找不到任何真正性感的东西。

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

【讨论】:

同上跟进。我通过相同的来源,找不到任何可接受的解决方案。我什至分叉了术士并开始在他们的类定义中实现递归(这看起来应该相当容易),但放弃了。【参考方案2】:

python-jsonschema-objects 是术士的替代品,建立在 jsonschema 之上

python-jsonschema-objects 提供基于类的自动绑定到 JSON 模式以在 python 中使用。

用法:

示例 Json 架构

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"]
 '''

将模式对象转换为类

 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  

验证:

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

但问题是,它仍在使用 draft4validation,而 jsonschema 已移至 draft4validation,我在 repo 上提交了一个关于此的 issue。 除非您使用的是旧版本的 jsonschema ,否则上述包将如图所示。

【讨论】:

值得注意的是python-jsonschema-objects 支持 JSON Schema Draft-4【参考方案3】:

我刚刚创建了这个小项目来从 json 模式生成代码类,即使处理 python 我认为在业务项目中工作时会很有用:

pip install jsonschema2popo

运行以下命令将生成一个包含 json-schema 定义的类的 python 模块(它使用 jinja2 模板)

jsonschema2popo -o /path/to/output_file.py /path/to/json_schema.json

更多信息请访问:https://github.com/frx08/jsonschema2popo

【讨论】:

该库实现了它的承诺,但有一些愚蠢的假设、错误和拼写错误。所有可寻址但远未完善。

以上是关于将 JSON 模式转换为 python 类的主要内容,如果未能解决你的问题,请参考以下文章

如何将 json 文件转换为 python 类?

Python爬虫编程思想(79): 将JSON字符串转换为类实例

Python爬虫编程思想(79): 将JSON字符串转换为类实例

使用 Python 的 JSON 和 AJAX [关闭]

Python爬虫编程思想(80): 将类实例转换为JSON字符串

Python爬虫编程思想(80): 将类实例转换为JSON字符串