Pregunta Esquema JSON: se requiere un campo de especificación basado en el valor de otro campo


Me pregunto si esto es posible con el borrador del esquema 03. He conseguido que las dependencias funcionen en otro lugar, creo que posiblemente solo se requiera un poco de uso creativo para usarlas para especificar el required propiedad de algún campo.

Mi mejor intento actual (que no funciona) debería darte una idea de lo que estoy buscando. Quiero un valor requerido por defecto, y opcional cuando otro campo tiene un valor particular.

{
    "description"   : "An address...",
    "type" : "object",
    "properties" : {
        "postcode": {
            "type" : "string",
            // postcode should be required by default
            "required" : true,      
            // postcode shouldn't be required if the country is new zealand 
            "dependencies" : {
                "country" : {
                    "enum" : ["NZ", "NZL", "NEW ZEALAND"]
                },
                "postcode" : {
                    "required" : false      
                }
            }
        },
        "country": {
            "type" : "string",
            "enum" : [
                // various country codes and names...
            ],
            "default" : "AUS"
        }
    }
}

32
2018-01-27 05:59


origen


Respuestas:


Esto es definitivamente posible con la versión 3 del borrador. Como tiene una lista completa de países permitidos, puede hacer algo como esto:

{
    "type": [
        {
            "title": "New Zealand (no postcode)",
            "type": "object",
            "properties": {
                "country": {"enum": ["NZ", "NZL", "NEW ZEALAND"]}
            }
        },
        {
            "title": "Other countries (require postcode)",
            "type": "object",
            "properties": {
                "country": {"enum": [<all the other countries>]},
                "postcode": {"required": true}
            }
        }
    ],
    "properties": {
        "country": {
            "type" : "string",
            "default" : "AUS"
        },
        "postcode": {
            "type" : "string"
        }
    }
}

Entonces, realmente define dos subtipos para su esquema, uno para los países que requieren un código postal y otro para los países que no lo necesitan.

EDITAR - el equivalente v4 es extremadamente similar. Simplemente cambie el nombre del nivel superior "type" matriz para "oneOf".


26
2017-07-25 14:50



Si alguien está buscando una solución para el borrador 4, puede usar dependencies palabra clave junto con un enum palabra clave:

{
    "type": "object",
    "properties": {
        "play": {
            "type": "boolean"
        },
        "play-options": {
            "type": "string"
        }
    },
    "dependencies": {
        "play-options": {
            "properties": {
                "play": {
                     "enum": [true]
                }
            }
        }
    }
}

De este modoplay-options siempre requerirá play valor para ser true.


11
2017-10-27 19:44



Acabo de revisar la versión 03 de la especificación y no creo que lo que describes sea posible. Definitivamente no es "Dependencia simple" y la descripción de "Dependencia de esquema" no menciona ninguna forma de considerar el valor de la propiedad.

Parece que lo que necesitas es "Dependencia de esquema condicional".

Hay una discusión sobre lo que es posible con las dependencias Simple y Schema aquí: http://groups.google.com/group/json-schema/msg/8145690ebb93963b

Puede preguntar a ese grupo si hay planes para admitir dependencias condicionales.


2
2018-02-01 20:14



Intenta usar dependencias con 'id':

{
  "title": "Test dependncies",
  "readOnly": false,
  "$schema": "http://json-schema.org/draft-04/hyper-schema",
  "description": "This a test to show how we can use dependencies in json schema",
  "properties":{
      "graduate": {
          "title":"Graduate?",
          "type":"string",
          "enum":["Yes","No"],
           "options": {
           "dependencies":[
              {"id":"minimumEligibilityAge","value":"Yes"},
              {"id":"courseName","value":"No"}
              ]
           }
      },
      "minimumEligibilityAge":{
          "id":"minimumEligibilityAge",
          "title":"Enter Age",
          "type":"number",
          "options":{"hide_display":true}
          },
      "courseName":{
          "id":"courseName",
          "title":"Enter Graduation Course Name",
          "type":"string"
      }
  },
  "type": "object"
}

Si el valor del graduado es Sí, se requiere un mínimo de elegibilidad. Si el valor del graduado es No, se requiere courseName


0
2017-11-03 19:55