Схема JSON - укажите обязательное поле на основе значения другого поля - PullRequest
35 голосов
/ 27 января 2012

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

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

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

Ответы [ 3 ]

27 голосов
/ 25 июля 2012

Это определенно возможно с версией 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"
        }
    }
}

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

РЕДАКТИРОВАТЬ - эквивалент v4 чрезвычайно похож. Просто переименуйте массив "type" верхнего уровня в "oneOf".

12 голосов
/ 27 октября 2016

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

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

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

2 голосов
/ 02 февраля 2012

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

Звучит так, как будто вам нужна «условная зависимость схемы».

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

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

...