¿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, byc)

"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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta