2012-09-17 62 views
17

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

+0

您可否详细说明为什么[json](http://docs.python.org/library/json.html)标准库模块的功能不足以满足您的需求,并且您需要生成的类定义? –

+5

你的评论的答案很简单 - 与原始字典一起工作是二类对象管理,大多数人不喜欢JSON提供的面部霰弹枪爆炸。 – synthesizerpatel

回答

17

到目前为止,我已经能够找到最接近的是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并生成请求生成器和响应处理程序的树。术士看起来并不太离谱,唯一的缺点是Python中的元类无法真正转化为“代码”。

其他有用的模块来寻找:

如果你最终找到此请按照你的问题一个很好的一站式解决方案之间 - 我很想找到一个。我倒过github,pypi,googlecode,sourceforge等等。而且找不到任何真正性感的东西。由于缺乏任何预制解决方案,我可能会与术士自己一起拼凑一些东西。所以如果我打败你,我会更新我的答案。 :P

+1

同上跟进。我经历了相同的来源,找不到任何可接受的解决方案。我甚至派了术士,开始在他们的类定义中实现递归(看起来应该相当容易),但放弃了。 –

5

python-jsonschema-objects是术士替代,建立在jsonschema的顶部

蟒-jsonschema对象提供了一个自动基于类的结合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 
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 was less or equal to than 0

但问题是,它仍然使用draft4validation,而jsonschema已经通过draft4validation,我提交了一个问题回购这件事。 除非您使用旧版本的jsonschema,否则上述软件包将如图所示工作。