ここにも同様の質問があることは知っていますが、それは私の問題に実際には対処していませんでした。つまり、一方のフィールドをもう一方のフィールドの値に依存させたいのです。ただし、一部の値については、フィールドを必須にしたくありません。次に例を示します。
スキーマ
{
"definitions": {},
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"colour": {
"type": "string",
"enum": ["red", "black", "blue"]
},
"blackQuote": {
"type": "string",
"maxLength": 11
},
"redQuote": {
"type": "string",
"maxLength": 11
}
},
"oneOf": [
{
"properties": {
"colour": {"enum": ["red"]}
},
"required": ["redQuote"]
},
{
"properties": {
"colour": {"enum": ["black"]}
},
"required": ["blackQuote"]
}
],
"required": [
"colour"
]
}
これは次のように機能します。
これは、含意(!AまたはB)と呼ばれるブール論理の概念を使用して行うことができます。 「if-then」ステートメントのように使用できます。たとえば、「color」が「red」ではないか、「redQuote」が必要です。これを使用する必要があるときはいつでも、definitions
で分解して、可能な限りニースと表示されるようにします。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"colour": { "enum": ["red", "black", "blue"] },
"blackQuote": { "type": "string", "maxLength": 11 },
"redQuote": { "type": "string", "maxLength": 11 }
},
"allOf": [
{ "$ref": "#/definitions/red-requires-redQuote" },
{ "$ref": "#/definitions/black-requires-blackQuote" }
],
"required": ["colour"],
"definitions": {
"red-requires-redQuote": {
"anyOf": [
{ "not": { "$ref": "#/definitions/is-red" } },
{ "required": ["redQuote"] }
]
},
"black-requires-blackQuote": {
"anyOf": [
{ "not": { "$ref": "#/definitions/is-black" } },
{ "required": ["blackQuote"] }
]
},
"is-red": {
"properties": {
"colour": { "enum": ["red"] }
}
},
"is-black": {
"properties": {
"colour": { "enum": ["black"] }
}
}
}
}
ドラフト-04の最も簡単な答え(コメントでGaneshが指摘したように):
{
"definitions": {},
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"colour": {
"type": "string",
"enum": ["red", "black", "blue"]
},
"blackQuote": {
"type": "string",
"maxLength": 11
},
"redQuote": {
"type": "string",
"maxLength": 11
}
},
"oneOf": [
{
"properties": {
"colour": {"enum": ["red"]}
},
"required": ["redQuote"]
},
{
"properties": {
"colour": {"enum": ["black"]}
},
"required": ["blackQuote"]
},
{
"properties": {
"colour": {"enum": ["blue"]}
}
}
],
"required": [
"colour"
]
}
必要なものの詳細をOneOfに移動すると、特に色の他の値が大量に発生する場合は、すべてを非常に単純に保つことができます。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"oneOf": [
{
"type": "object",
"properties": {
"colour": {
"type": "string",
"enum": [
"red"
]
},
"redQuote": {
"type": "string",
"maxLength": 11
}
},
"required": [
"redQuote"
]
},
{
"type": "object",
"properties": {
"colour": {
"type": "string",
"enum": [
"black"
]
},
"blackQuote": {
"type": "string",
"maxLength": 11
}
},
"required": [
"blackQuote"
]
},
{
"type": "object",
"properties": {
"colour": {
"type": "string",
"enum": [
"blue"
]
}
}
}
],
"definitions": {}
}