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"
}
}
}
Ответы
Ответ 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, для него требуется имя курса