Tengo este esquema padre:

{
    "definitions": {
        "parcel": {
            "type": "object",
            "properties": {
                "id": {
                    "type": "string"
                },
                "accountNumber": {
                    "type": "string"
                },
                "parcelNumber": {
                    "type": "string"
                },
                "propertyType": {
                    "type": "string"
                },
                "address": {
                    "$ref": "address.json#/definitions/address"
                },
                "coordinates": {
                    "$ref": "coordinates.json#/definitions/coordinates"
                }
            },
            "required": ["accountNumber", "parcelNumber"]
        }
    }
}

A continuación se muestran los subesquemas a los que se hace referencia:

{
    "definitions": {
        "address": {
            "type": "object",
            "properties": {
                "addressString": {
                    "type": "string",
                    "addressType": {
                        "enum": ["residential", "business"]
                    }
                },
                "required": ["addressString"]
            }
        }
    }
}

    {
    "definitions": {
        "coordinates": {
            "type": "object",
            "properties": {
                "latitude": {
                    "type": "number"
                },
                "longitude": {
                    "type": "number"
                },
                "projection": {
                    "type": "string"
                }
            },
            "required": ["latitude ", "longitude", " projection"]
        }
    }
}

Quiero aplicar las siguientes condiciones al esquema principal.

  1. Se proporciona la dirección, las coordenadas o ambas.
  2. Debería fallar la validación si no se proporcionan ni la dirección ni las coordenadas.
3
Hussain ali 15 dic. 2016 a las 22:49

2 respuestas

La mejor respuesta

Su solución anyOf funciona. Puede hacerlo un poco más limpio separando las propiedades requeridas fijas (accountNumber y parcelNumber) del grupo de propiedades anyOf:

{
  "type": "object",
  "required": [
    "accountNumber",
    "parcelNumber"
  ],
  "anyOf": [
    {"required" : ["address"]},
    {"required" : ["coordinates"]}
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "accountNumber": {
      "type": "string"
    },
    "parcelNumber": {
      "type": "string"
    },
    "propertyType": {
      "type": "string"
    },
    "address": {
      "type": "object",
      "properties": {
        "addressString": {
          "type": "string"
        },
        "addressType": {
          "enum": [
            "residential",
            "business"
          ]
        }
      },
      "required": [
        "addressString"
      ]
    },
    "coordinates": {
      "type": "object",
      "properties": {
        "latitude": {
          "type": "number"
        },
        "longitude": {
          "type": "number"
        },
        "projection": {
          "type": "string"
        }
      },
      "required": [
        "latitude",
        "longitude",
        "projection"
      ]
    }
  }
}

Aquí hay una esencia para referencia:

http://jsonschemalint.com/#/version/draft-05/markup/json?gist=f36d9a7e080c4d25dbbf09b7dd03137e

6
Ted Epstein 16 dic. 2016 a las 19:26

Así es como implementé la solución.

"anyOf": [{
    "required": ["accountNumber", "parcelNumber", "coordinates"]
}, {
    "required": ["accountNumber", "parcelNumber", "address"]
}]
2
Hussain ali 15 dic. 2016 a las 23:27