Python 检测json模式是否具有模式类型
我想检查一个模式中是否只有一个模式,或者其中是否有多个具有oneOf属性的模式 python代码应该是这样的Python 检测json模式是否具有模式类型,python,json,jsonschema,json-schema-validator,Python,Json,Jsonschema,Json Schema Validator,我想检查一个模式中是否只有一个模式,或者其中是否有多个具有oneOf属性的模式 python代码应该是这样的 If schema1 has oneOf property: Some code1 If schema1 is just a single schema: Some code2 本质上,我希望能够区分这两种模式 方案1 "schema1": { "definitions": { "schema": { "type": "o
If schema1 has oneOf property:
Some code1
If schema1 is just a single schema:
Some code2
本质上,我希望能够区分这两种模式
方案1
"schema1": {
"definitions": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": ["string", "null"]
}
}
}
}
}
方案2
"schema2": {
"definitions": {
"schema": {
"oneOf": [
{
"type": ["null"]
},
{
"type": ["string"],
"enum": ["NONE"]
}
]
}
}
}
如何在Python中实现这一点
编辑:更正了我的示例模式下面是一个示例,展示了一种递归检查所提供的json中是否有oneOf属性的方法。如果您特别希望只检查json的“schema”部分,则需要检查parent属性
#!/usr/bin/env python
import json
def objectHasKey(object_,key_):
_result = False
if (type(object_)==dict):
for _key in object_.keys():
print _key
if (type(object_[_key])==dict):
_dict = object_[_key]
_result = objectHasKey(_dict,key_)
if _key == key_:
_result = True
if _result:
break
return _result
firstJSONText = '''
{
"definitions": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
]
}
}
}
}
}
'''
first = json.loads(firstJSONText)
secondJSONText = '''
{
"definitions": {
"schema": {
"oneOf": [
{
"type": [
"null"
]
},
{
"type": [
"string"
],
"enum": [
"NONE"
]
}
]
}
}
}
'''
second = json.loads(secondJSONText)
target = first
if objectHasKey(target,'oneOf'):
print "Handle oneOf with first"
else:
print "Handle default with first"
target = second
if objectHasKey(target,'oneOf'):
print "Handle oneOf with second"
else:
print "Handle default with second"
带有输出的示例调用
csmu-macbook-pro-2:detect-if-a-json-schema-has-a-oneof-type-schema admin$ ./test-for-schema.py
definitions
schema
type
properties
name
type
Handle default with first
definitions
schema
oneOf
Handle oneOf with second
这些模式看起来“错误”——它们是您正在使用的实际模式吗。。。如果是这样,对象本身会显式地声明它们是哪个模式。如果不是。。请给出一些示例数据,在这些数据中,您必须确定哪个模式已就位。@KeithJohnHutchison我已更正了问题中的示例模式。这不是我使用的确切模式,但与之类似。我的编辑现在纠正了模式还是仍然错误?只是一个简短的说明。从我在代码中看到的任何“其中之一”都可以在树下找到。因此,它可能不属于您正在查看的(子)模式。该代码不适用于$ref。