¿Cómo especificar cuál de los elementos debe tomar un objeto JSON?
Usando Python yjsonschema
Estoy tratando de validar la asignación deObjA
oObjB
etc. abeta
(test.json
)
{
"alpha": {
"beta": "ObjA"
}
}
En mi esquematestschema.json
) beta
esoneOf
un número de elementos y cada elemento se define a continuación (con valores diferentes paraa
, b
yc
)
"ObjA": {
"type": "object",
"properties": {
"items": {
"a": [90, 95],
"b": [4, 8],
"c": [0.2, 0.6]
}
},
"additionalProperties": false
}
Es decir,beta
puede asumironeOf
valores que sonObjA
, ObjB
, ObjC
yObjD
. Simplemente estoy tratando de especificar cuál debería usar entest.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
...
}
}
}
},
Sin embargo, al intentar validar contra el esquema usandojsonschema.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)
Obtuve el siguiente error
Failed validating 'oneOf' in schema['properties']['alpha']['properties']['beta']:
Aquí está todo el mensaje.
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)
Usando el en líneajsonschema
validador (http://json-schema-validator.herokuapp.com/) test.json
no valida, así que eliminé cualquier mención dealpha
del archivo (es decir, a este{ }
) y el validador informó lo siguiente
[ {
"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" ]
} ]
Restaurandotest.json
de vuelta, la validación da
[ {
"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" ]
} ]
}
} ]
¿Alguien sabe la forma correcta de hacer esto?
Gracias.