常に2つのプロパティを持つjsonオブジェクトを検証する必要があります。
タイプは「A」、「B」または「C」であり、
タイプが「A」の場合、プロパティ「foo」も必要であり、追加のプロパティは許可されません。
OK:
{
"type": "A",
"name": "a",
"foo": "a",
}
よくない:
{
"type": "A",
"name": "a",
"foo": "a",
"lol": "a"
}
タイプが「B」の場合、プロパティ「bar」が必要であり、追加のプロパティは許可されません。
タイプが「C」の場合、プロパティ「bar」が必須であり、オプションで「zen」プロパティも存在できます。
OK:
{
"type": "C",
"name": "a",
"bar": "a",
"zen": "a"
}
{
"type": "C",
"name": "a",
"bar": "a",
}
よくない:
{
"type": "C",
"name": "a",
"bar": "a",
"lol": "a"
}
残念ながら、この質問に対する優れた回答は私のケースを部分的にカバーしていますが、私は自分に合ったjsonschemaを構築することができませんでした。
編集:
これが私が試したものです。
{
"$schema": "http://json-schema.org/draft-04/schema",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": ["A", "B", "C"]
},
"name": {"type": "string"},
"foo": {"type": "string"},
"bar": {"type": "string"},
"zen": {"type": "string"},
},
"anyOf": [
{
"properties": {"type": {"enum": ["A"]}},
"required": ["foo"],
},
{
"properties": {"type": {"enum": ["B"]}},
"required": ["bar"],
},
{
"properties": {"type": {"enum": ["C"]}},
"required": ["bar"],
},
]
}
私の問題は、「anyOf」のオブジェクト内でフィールド「additionalProperties」をfalseに設定しても、期待した結果が得られないことです。
たとえば、次のjsonは、追加のプロパティ「lol」があるにもかかわらず、検証に合格します。
{
"type": "A",
"name": "a",
"foo": "a",
"lol": "a"
}
JSONスキーマは、各サブスキーマの制約が個別に評価される制約システムです。つまり、「additionalProperties」は、同じ即時スキーマオブジェクト内の「properties」または「patternProperties」のみを「表示」できます。
さらに、「プロパティ」と「patternProperties」のみに基づいて、「必須」に基づいてプロパティを「表示」することはできません。
私の知る限り、anyOfの各ブランチ内で「additionalProperties」:falseを設定している場合、許可されるプロパティは「type」のみであるため、これは機能しないはずです。それを実行し、「type」以外のプロパティを許可している場合は、使用している実装を知りたいと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加