JSON类型定义的Python实现
jtd的Python项目详细描述
jtd:Python的JSON验证
jtd
是JSON Type Definition模式的Python实现
JSON语言。jtd
主要提供两个功能:
- 根据JSON Typedef架构验证输入数据。在
- JSON Typedef模式的Python表示。在
通过这个包,您可以将JSON Typedef支持的验证添加到 或者您可以在JSON类型定义的基础上构建自己的工具。在
安装
您可以使用pip
安装此软件包:
pip install jtd
文件
详细的API文档可在线获取,网址为:
有关一般JSON Typedef或JSON Typedef的更多高级文档 特别是与Python结合使用时,请参见:
基本用途
For a more detailed tutorial and guidance on how to integrate
jtd
in your application, see "Validating JSON in Python with JSON Typedef" in the JSON Typedef docs.
下面是一个示例,说明如何使用此包验证JSON数据 JSON Typedef架构:
^{pr2}$高级用法:限制返回的错误
默认情况下,jtd.validate
返回它发现的每个错误。如果你只关心
是否有任何错误,或者如果你不能显示更多的数字
如果出现错误,则可以使用jtd.validate
获得更好的性能
max_errors
选项。在
例如,从前面的相同示例中,将其限制为1个错误,我们 获取:
# Outputs:## [ValidationError(instance_path=[], schema_path=['properties', 'name'])]options=jtd.ValidationOptions(max_errors=1)print(jtd.validate(schema=schema,options=options,instance={'age':'43','phones':['+44 1234567',442345678],}))
高级用法:处理不受信任的架构
如果要对不信任的架构运行jtd
,则应:
- 在
在上使用
在validate()
方法,确保架构格式正确jtd.Schema
。这将检查诸如确保所有ref
的 相应的定义。在 - 在
使用
jtd.validate
选项调用jtd.validate
。JSON Typedef允许您编写 递归模式——如果要根据不可信的模式进行计算,则 在针对恶意输入进行计算时可能会进入无限循环, 比如这个:{"ref":"loop","definitions":{"loop":{"ref":"loop"}}}
在max_depth
选项告诉jtd.validate
接下来有多少ref
在放弃并抛出jtd.MaxDepthExceededError
之前递归。在
下面是一个示例,说明如何使用jtd
对不可信的数据进行评估
架构:
importjtd# validate_untrusted returns true if `data` satisfies `schema`, and false if it# does not. Throws an error if `schema` is invalid, or if validation goes in an# infinite loop.defvalidate_untrusted(schema,data):schema.validate()# You should tune max_depth to be high enough that most legitimate schemas# evaluate without errors, but low enough that an attacker cannot cause a# denial of service attack.options=jtd.ValidationOptions(max_depth=32)returnlen(jtd.validate(schema=schema,instance=data,options=options))==0}# Returns truevalidate_untrusted(jtd.Schema.from_dict({'type':'string'}),'foo')# Returns falsevalidate_untrusted(jtd.Schema.from_dict({'type':'string'}),None)# Throws "invalid schema"validate_untrusted(jtd.Schema.from_dict({'type':'nonsense'}),'foo')# Throws an instance of jtd.MaxDepthExceededErrorvalidate_untrusted({"ref":"loop","definitions":{"loop":{"ref":"loop"}}},None)
- 项目
标签: