Спасибо за отличное объяснение. Позор, эта функция не доступна.
ьзование Python иjsonschema
Я пытаюсь подтвердить назначениеObjA
или жеObjB
и т. д.beta
(test.json
)
{
"alpha": {
"beta": "ObjA"
}
}
В моей схеме (testschema.json
) beta
являетсяoneOf
количество элементов, и каждый элемент определяется как показано ниже (с различными значениями дляa
, b
, а такжеc
)
"ObjA": {
"type": "object",
"properties": {
"items": {
"a": [90, 95],
"b": [4, 8],
"c": [0.2, 0.6]
}
},
"additionalProperties": false
}
То естьbeta
может взять на себяoneOf
значения, которыеObjA
, ObjB
, ObjC
а такжеObjD
, Я просто пытаюсь указать, какой он должен использовать вtest.json
"alpha": {
"type": "object",
"properties": {
"beta": {
"oneOf": [
{
"type": "object",
"properties": {
"ObjA": {
"type": "object",
"properties": {
"items": {
"a": [90, 95],
"b": [4, 8],
"c": [0.2, 0.6]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "object",
"properties": {
"ObjB": {
"type": "object",
"properties": {
"items": {
"a": [100],
"b": [0],
"c": [0]
}
},
"additionalProperties": false
}
}
},
...
ObjC and ObjD defined
...
}
}
}
},
Тем не менее, при попытке проверить по схеме, используяjsonschema.validate()
### Test the whole JSON is valid against the Schema
def test_valid__JSON_against_schema(self):
with open(schema_filename) as schema_file:
test_schema = json.load('testschema.json')
schema_file.close()
with open(json_filename) as json_file:
test_json = json.load('test.json')
json_file.close()
validate(test_json, test_schema)
Я получаю следующую ошибку
Failed validating 'oneOf' in schema['properties']['alpha']['properties']['beta']:
Вот и все сообщение
E
======================================================================
ERROR: test_valid__JSON_against_schema (__main__.SchemaTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_test-variables.py", line 35, in test_valid__JSON_against_schema
validate(test_json, test_schema)
File "/local/tools/PACKAGES/python3/lib/python3.6/site-packages/jsonschema/validators.py", line 541, in validate
cls(schema, *args, **kwargs).validate(instance)
File "/local/tools/PACKAGES/python3/lib/python3.6/site-packages/jsonschema/validators.py", line 130, in validate
raise error
jsonschema.exceptions.ValidationError: 'ObJA' is not valid under any of the given schemas
Failed validating 'oneOf' in schema['properties']['alpha']['properties']['beta']:
{'oneOf': [{'additionalProperties': False,
'properties': {'ObjA': {'additionalProperties': False,
'properties': {'items': {'a': [0.2, 0.6],
'b': [90, 95],
'c': [4, 8]}},
'type': 'object'}},
'type': 'object'},
{'additionalProperties': False,
'properties': {'ObjB': {'additionalProperties': False,
'properties': {'items': {'a': [0],
'b': [100],
'c': [0]}},
'type': 'object'}},
'type': 'object'},
{'additionalProperties': False,
'properties': {'ObjC': {'additionalProperties': False,
'properties': {'items': {'a': [0],
'b': [50],
'c': [50]}},
'type': 'object'}},
'type': 'object'},
{'additionalProperties': False,
'properties': {'ObjD': {'additionalProperties': False,
'properties': {'items': {'a': [100],
'b': [0],
'c': [0]}},
'type': 'object'}},
'type': 'object'}]}
On instance['alpha']['beta']:
'ObjA'
----------------------------------------------------------------------
Ran 1 test in 0.007s
FAILED (errors=1)
Использование онлайнjsonschema
валидатор (http://json-schema-validator.herokuapp.com/) test.json
не подтверждает, поэтому я удалил упоминание оalpha
из файла (то есть к этому{ }
) и валидатор сообщил следующее
[ {
"level" : "warning",
"schema" : {
"loadingURI" : "#",
"pointer" : "/properties/alpha/properties/beta/oneOf/0/properties/ObjA/properties/items"
},
"domain" : "syntax",
"message" : "the following keywords are unknown and will be ignored: [a, b, c]",
"ignored" : [ "a", "b", "c" ]
} ]
Восстановлениеtest.json
назад, проверка дает
[ {
"level" : "warning",
"schema" : {
"loadingURI" : "#",
"pointer" : "/properties/alpha/properties/beta/oneOf/0/properties/ObjA/properties/items"
},
"domain" : "syntax",
"message" : "the following keywords are unknown and will be ignored: [a, b, c]",
"ignored" : [ "a", "b", "c" ]
}, {
"level" : "warning",
"schema" : {
"loadingURI" : "#",
"pointer" : "/properties/alpha/properties/beta/oneOf/0/properties/ObjA/properties/items"
},
"domain" : "syntax",
"message" : "the following keywords are unknown and will be ignored: [a, b, c]",
"ignored" : [ "a", "b", "c" ]
}, {
"level" : "warning",
"schema" : {
"loadingURI" : "#",
"pointer" : "/properties/alpha/properties/beta/oneOf/0/properties/ObjA/properties/items"
},
"domain" : "syntax",
"message" : "the following keywords are unknown and will be ignored: [a, b, c]",
"ignored" : [ "a", "b", "c" ]
}, {
"level" : "error",
"schema" : {
"loadingURI" : "#",
"pointer" : "/properties/alpha/properties/beta"
},
"instance" : {
"pointer" : "/alpha/beta"
},
"domain" : "validation",
"keyword" : "oneOf",
"message" : "instance failed to match exactly one schema (matched 0 out of 1)",
"matched" : 0,
"nrSchemas" : 1,
"reports" : {
"/properties/alpha/properties/beta/oneOf/0" : [ {
"level" : "warning",
"schema" : {
"loadingURI" : "#",
"pointer" : "/properties/alpha/properties/beta/oneOf/0/properties/ObjA/properties/items"
},
"domain" : "syntax",
"message" : "the following keywords are unknown and will be ignored: [a, b, c]",
"ignored" : [ "a", "b", "c" ]
}, {
"level" : "error",
"schema" : {
"loadingURI" : "#",
"pointer" : "/properties/alpha/properties/beta/oneOf/0"
},
"instance" : {
"pointer" : "/alpha/beta"
},
"domain" : "validation",
"keyword" : "type",
"message" : "instance type (string) does not match any allowed primitive type (allowed: [\"object\"])",
"found" : "string",
"expected" : [ "object" ]
} ]
}
} ]
Кто-нибудь знает правильный способ сделать это?
Благодарю.