Определить, имеет ли схема json схему типа oneOf
Я хочу проверить, содержит ли схема только одну схему или несколько схем с помощью свойства oneOf.
Код Python должен быть примерно таким
If schema1 has oneOf property:
Some code1
If schema1 is just a single schema:
Some code2
По сути, я хочу иметь возможность различать эти 2 типа схем
SCHEMA1
"schema1": {
"definitions": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": ["string", "null"]
}
}
}
}
}
SCHEMA2
"schema2": {
"definitions": {
"schema": {
"oneOf": [
{
"type": ["null"]
},
{
"type": ["string"],
"enum": ["NONE"]
}
]
}
}
}
Как я могу сделать это в Python?
Изменить: исправил мой пример схемы
1 ответ
Решение
Вот пример, показывающий способ рекурсивной проверки, есть ли свойство oneOf в предоставленном json. Вам нужно будет проверить родительское свойство, если вы специально хотите проверить только часть схемы json.
#!/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