He separado mis esquemas JSON en dos archivos.

person-input.json (todas las propiedades que se establecerán mediante entradas).

person.json (mantenga una referencia a person-input.json pero también tenga dateUpdate, dateCreated y DateDeleted).

Esto para separar las entradas de las propiedades de fecha generadas automáticamente.

No quiero que ninguna publicación pueda agregar propiedades no deseadas a mis datos, así que pensé que usaría "additionalProperties": false el problema es que si lo uso en el archivo person-input.json no aceptará mi " fecha "propiedades del archivo person.json. Y si lo coloco en el archivo person.json, no impide que se agreguen propiedades aleatorias. ¿Hay una solución para esto?

Así que esto a continuación no funciona, ¿he perdido el "additionalProperties": false?

person.json

{
  "allOf": [
    {
      "$ref": "./person-input.json"
    },
    {
      "type": "object",
      "properties": {
        "dateCreated": {
        "name": "dateCreated",
        "type": "string",
        "description": "date created",
        "example": "2019-09-02T11:17:41.783Z"
        },
        "dateUpdated": {
          "type": "string",
          "nullable": true,
          "description": "date updated",
          "example": "2019-09-02T11:17:41.783Z"
        },
        "dateDeleted": {
          "type": "string",
          "nullable": true,
          "description": "date deleted",
          "example": "2019-09-02T11:17:41.783Z"
        }
      },
      "additionalProperties": false
    }
  ]
}
4
csk87 30 sep. 2019 a las 17:36

1 respuesta

La mejor respuesta

additionalProperties no puede "ver a través" de aplicadores como allOf, ni puede "ver a través" del uso de $ref.

Para solucionar este problema, debe hacer ALGUNA duplicación de su esquema en su esquema más externo / superior, y eliminar el requisito additionalProperties: false de cualquier esquema secundario.

additionalProperties: false funciona aplicando false (que es un esquema válido, que devuelve una falla en la validación) a los valores que no coinciden con las claves basadas en properties o patternProperties dentro del MISMO esquema objeto.

La validación con "additionalProperties" se aplica solo al niño
valores de nombres de instancia que no coinciden con ningún nombre en "propiedades", y no coinciden con ninguna expresión regular en "patternProperties".

https://tools.ietf.org /html/draft-handrews-json-schema-validation-01#section-6.5.6 (borrador-7)

Entonces, si necesita copiar todas las propiedades que necesita en el esquema de nivel superior. ¡Sí, esto no es agradable!

Puede hacerlo un poco más agradable observando el hecho de que los valores de un objeto properties son esquemas y, como tal, pueden ser simplemente true, lo que permite que los esquemas secundarios realicen la validación más tarde.

Aquí hay un ejemplo que voy a usar en una próxima charla:

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "title": "MatchMakerExchange format for queries",
  "definitions": {
    "phenotypicFeatures": {
      "type": [
        "array"
      ]
    },
    "genomicFeatures": {
      "type": [
        "array"
      ]
    },
    "geneticsPatient": {
      "properties": {
        "phenotypicFeatures": {
          "$ref": "#/definitions/phenotypicFeatures"
        },
        "genomicFeatures": {
          "$ref": "#/definitions/genomicFeatures"
        }
      },
      "anyOf": [
        {
          "required": [
            "phenotypicFeatures"
          ]
        },
        {
          "required": [
            "genomicFeatures"
          ]
        }
      ]
    },
    "regularPatient": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": [
            "string"
          ]
        }
      }
    }
  },
  "properties": {
    "patient": {
      "additionalProperties": false,
      "properties": {
        "name": true,
        "phenotypicFeatures": true,
        "genomicFeatures": true
      },
      "allOf": [
        {
          "$ref": "#/definitions/regularPatient"
        },
        {
          "$ref": "#/definitions/geneticsPatient"
        }
      ]
    }
  }
}

Bien puedes preguntar ... "Bueno, eso es una locura. ¿Puedes arreglar esto por favor?" - Lo hicimos. Se llama borrador 2019-09 y se lanzó recientemente, por lo que tendrá que esperar a que las implementaciones se pongan al día.

Una nueva palabra clave, unevaluatedProperties depende de los resultados de la anotación, pero aún debe eliminar additionalProperties: false de los esquemas secundarios.

7
Relequestual 30 sep. 2019 a las 15:32