Подтвердить что ты не робот

JSON Schema: Как мне потребовать одно поле или другое (или одно из двух других), но не все из них?

У меня возникли проблемы с приложением схемы JSON, которая будет проверять, содержит ли JSON:

  • только одно поле
  • другое поле
  • (только одно из двух полей)

но не соответствовать, если присутствуют кратные.

В моем случае, я хочу, чтобы один из

  • COPYALL
  • FileNames
  • matchesFiles и/или doesntMatchFiles

чтобы подтвердить, но я не хочу принимать, когда больше, чем есть.

Вот что у меня до сих пор:

{
    "$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"]}}]}
    ]
} ;

Это соответствует больше, чем я хочу. Я хочу, чтобы это соответствовало всем следующим:

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

но не для соответствия:

{"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"}

Я предполагаю, что я вижу что-то очевидное, я хочу знать, что это такое.

4b9b3361

Ответ 1

Проблема - это "не" семантика. "не требуется" не означает "запрет включения". Это просто означает, что вам не нужно добавлять его, чтобы проверить эту схему.

Однако вы можете использовать "oneOf", чтобы упростить вашу спецификацию. Напомним, что это означает, что "только одна из этих схем может проверять". Следующая схема обеспечивает переключение свойств, которое вы пытаетесь решить:

{
"$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"]
            }
        ]
    }
]
}