tellraw json validation jsonschema

json - tellraw 1.12 2 generator



¿Cómo necesito un campo u otro o(uno de los otros dos) pero no todos? (1)

El problema es la semántica "no". "no requerido" no significa "inclusión prohibida". Solo significa que no tiene que agregarlo para validar ese esquema.

Sin embargo, puede usar "oneOf" para satisfacer sus especificaciones de una manera más sencilla. Recuerde que significa que "solo uno de estos esquemas puede validar". El siguiente esquema logra la propiedad de cambio que está intentando resolver:

{ "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "required": [ "unrelatedA" ], "properties": { "unrelatedA": { "type": "string" }, "fileNames": { "type": "array" }, "copyAll": { "type": "boolean" }, "matchesFiles": { "type": "array" }, "doesntMatchFiles": { "type": "array" } }, "oneOf": [ { "required": [ "copyAll" ] }, { "required": [ "fileNames" ] }, { "anyOf": [ { "required": [ "matchesFiles" ] }, { "required": [ "doesntMatchFiles" ] } ] } ] }

Tengo problemas para encontrar un esquema JSON que valide si JSON contiene:

  • solo un campo
  • solo otro campo
  • (uno de los otros dos campos) solamente

pero no para coincidir cuando hay múltiplos de los presentes.

En mi caso específicamente, quiero uno de

  • copyAll
  • fileNames
  • matchesFiles y / o doesntMatchFiles

para validar, pero no quiero aceptar cuando hay más que eso.

Esto es lo que tengo hasta ahora:

{ "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "required": [ "unrelatedA" ], "properties": { "unrelatedA": { "type": "string" }, "fileNames": { "type": "array" }, "copyAll": { "type": "boolean" }, "matchesFiles": { "type": "array" }, "doesntMatchFiles": { "type": "array" } }, "oneOf": [ {"required": ["copyAll"], "not":{"required":["matchesFiles"]}, "not":{"required":["doesntMatchFiles"]}, "not":{"required":["fileNames"]}}, {"required": ["fileNames"], "not":{"required":["matchesFiles"]}, "not":{"required":["doesntMatchFiles"]}, "not":{"required":["copyAll"]}}, {"anyOf": [ {"required": ["matchesFiles"], "not":{"required":["copyAll"]}, "not":{"required":["fileNames"]}}, {"required": ["doesntMatchFiles"], "not":{"required":["copyAll"]}, "not":{"required":["fileNames"]}}]} ] } ;

Esto coincide más de lo que quiero. Quiero que esto coincida con todo lo siguiente:

{"copyAll": true, "unrelatedA":"xxx"} {"fileNames": ["aab", "cab"], "unrelatedA":"xxx"} {"matchesFiles": ["a*"], "unrelatedA":"xxx"} {"doesntMatchFiles": ["a*"], "unrelatedA":"xxx"} {"matchesFiles": ["a*"], "doesntMatchFiles": ["*b"], "unrelatedA":"xxx"}

pero no para coincidir:

{"copyAll": true, "matchesFiles":["a*"], "unrelatedA":"xxx"} {"fileNames": ["a"], "matchesFiles":["a*"], "unrelatedA":"xxx"} {"copyAll": true, "doesntMatchFiles": ["*b"], "matchesFiles":["a*"], "unrelatedA":"xxx"} {"fileNames": ["a"], "matchesFiles":["a*"], "unrelatedA":"xxx"} {"unrelatedA":"xxx"}

Supongo que hay algo obvio que me estoy perdiendo, me gustaría saber qué es.