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

JSON Schema - указать поле требуется на основании значения другого поля

Удивление, если это возможно с проектом схемы 03. У меня есть зависимости, работающие в другом месте, я думаю, что для их использования для определения свойства required для некоторого поля возможно, возможно, потребуется лишь некоторое творческое использование.

Моя текущая лучшая попытка (которая не работает) должна дать вам некоторое представление о том, что мне нужно. Я хочу значение, требуемое по умолчанию, и необязательное, если другое поле имеет определенное значение.

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

Ответ 1

Это определенно возможно с версией 3 проекта. Поскольку у вас есть полный список разрешенных стран, вы можете сделать что-то вроде этого:

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

Таким образом, вы фактически определяете два подтипа для вашей схемы, один для стран, которым требуется почтовый индекс, и один для стран, которые этого не делают.

EDIT - эквивалент v4 очень похож. Просто переименуйте массив верхнего уровня "type" в "oneOf".

Ответ 2

Если кто-то ищет решение для проекта 4, вы можете использовать ключевое слово dependencies вместе с ключевым словом enum:

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

Таким образом play-options всегда будет иметь значение play true.

Ответ 3

Я просто просмотрел версию спецификации 03, и я не думаю, что то, что вы описываете, возможно. Это определенно не "Простая зависимость", а описание "Зависимость схемы" не упоминает о каком-либо способе рассмотрения значения свойства.

Похоже, что вам нужно "Условная зависимость схемы".

Здесь обсуждается, что возможно с зависимостями Simple и Schema здесь: http://groups.google.com/group/json-schema/msg/8145690ebb93963b

Вы можете спросить эту группу, если есть планы поддержки условных зависимостей.

Ответ 4

Попробуйте использовать зависимости с '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"
}

Если значение выпускника равно Yes, для этого требуется minimumEligibilityAge. Если значение выпускника равно No, для него требуется имя курса