es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Propiedades de objetos basadas en $ref enum en JSON Schema.

Ya he revisado lo siguiente:


Necesito que mi esquema JSON obligue a que un objeto tenga todas las propiedades de un enum y no puedo entender cómo hacerlo.

stuff.list.json

Nota: Imagina esto, pero mucho más largo.

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://example.com/product.schema.json",
    "title": "ListOfStuff",
    "description": "Lista de cosas",
    "enum": [
        "Thing1",
        "Thing2",
        "Thing3"
    ],
    "uniqueItems": true
}

stuff.schema.json

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://example.com/product.schema.json",
    "title": "Stuff Defined",
    "description": "Detalles de las cosas",
    "type": "object",
    "properties": {
        /* una propiedad para cada valor enum de stuff.list.json */: { <----- ???
            "type": "array",
            "items": { /* Esquema para cada elemento */ }
        }
    },
    "required": [ /* $ref: ./stuff.list.json ?? */ ]
}

El resultado que espero que se cumpla es:

{
    "Thing1": [],
    "Thing2": [],
    "Thing3": []
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para garantizar que un objeto tenga todas las propiedades de un enumerado en un esquema JSON, se puede usar la palabra clave “properties” junto con la palabra clave “oneOf”.

    Primero, es necesario definir el enumerado en un archivo de esquema separado, como “stuff.list.json”. Este archivo debe contener solo los valores del enumerado, como se muestra a continuación:

    {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://example.com/list.schema.json",
        "title": "Lista de cosas",
        "description": "Lista de cosas",
        "enum": [
            "Thing1",
            "Thing2",
            "Thing3"
        ]
    }
    

    Luego, en el archivo principal del esquema, “stuff.schema.json”, se puede incluir una propiedad para cada valor del enumerado utilizando la palabra clave “$ref”. La palabra clave “$ref” hace referencia al archivo de esquema que define el enumerado. También es necesario utilizar la palabra clave “oneOf” para asegurarse de que solo una de las propiedades esté presente en el objeto. El esquema para cada elemento en el array se puede definir utilizando un archivo de esquema separado.

    Aquí tienes un ejemplo del archivo final “stuff.schema.json”:

    {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://example.com/product.schema.json",
        "title": "Cosas definidas",
        "description": "Detalles de las cosas",
        "type": "object",
        "oneOf": [
            {
                "required": [
                    "Thing1"
                ]
            },
            {
                "required": [
                    "Thing2"
                ]
            },
            {
                "required": [
                    "Thing3"
                ]
            }
        ],
        "properties": {
            "Thing1": {
                "$ref": "https://example.com/list.schema.json#/definitions/enumItem",
                "type": "array",
                "items": {
                    "$ref": "#/definitions/thing1Item"
                }
            },
            "Thing2": {
                "$ref": "https://example.com/list.schema.json#/definitions/enumItem",
                "type": "array",
                "items": {
                    "$ref": "#/definitions/thing2Item"
                }
            },
            "Thing3": {
                "$ref": "https://example.com/list.schema.json#/definitions/enumItem",
                "type": "array",
                "items": {
                    "$ref": "#/definitions/thing3Item"
                }
            }
        },
        "definitions": {
            "enumItem": {
                "enum": [
                    "Thing1",
                    "Thing2",
                    "Thing3"
                ]
            },
            "thing1Item": {
                /* Esquema para cada elemento en el array Thing1 */
            },
            "thing2Item": {
                /* Esquema para cada elemento en el array Thing2 */
            },
            "thing3Item": {
                /* Esquema para cada elemento en el array Thing3 */
            }
        }
    }
    

    Con este esquema JSON, un objeto debe contener solo una de las propiedades “Thing1”, “Thing2” o “Thing3”, y cada propiedad debe ser un array que contenga elementos que coincidan con el esquema correspondiente.

Comments are closed.