オブジェクトに可能な多くのプロパティの少なくとも1つを必要とするJSONスキーマ(ドラフト4)を定義できるかどうかを知りたいです。私はすでにallOf
、anyOf
、およびoneOf
を知っていますが、私が望む方法でそれらを使用する方法がわかりません。
以下に、JSONの例を示します。
// Test Data 1 - Should pass
{
"email": "[email protected]",
"name": "John Doe"
}
// Test Data 2 - Should pass
{
"id": 1,
"name": "Jane Doe"
}
// Test Data 3 - Should pass
{
"id": 1,
"email": "[email protected]",
"name": "John Smith"
}
// Test Data 4 - Should fail, invalid email
{
"id": 1,
"email": "thisIsNotAnEmail",
"name": "John Smith"
}
// Test Data 5 - Should fail, missing one of required properties
{
"name": "John Doe"
}
少なくともid
またはemail
(両方とも受け入れます)を要求し、フォーマットに応じた検証に合格したいです。 oneOf
を使用すると、両方を指定すると検証に失敗し(テスト3)、anyOf
のいずれかが無効であっても検証に合格します(テスト4)
これが私のスキーマです:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "https://example.com",
"properties": {
"name": {
"type": "string"
}
},
"anyOf": [
{
"properties": {
"email": {
"type": "string",
"format": "email"
}
}
},
{
"properties": {
"id": {
"type": "integer"
}
}
}
]
}
ユースケースの正しい検証を達成する方法を教えていただけますか?
一連のプロパティの少なくとも1つを要求するには、一連のrequired
オプション内でanyOf
を使用します。
{
"type": "object",
"anyOf": [
{"required": ["id"]},
{"required": ["email"]}
// any other properties, in a similar way
],
"properties": {
// Your actual property definitions here
}
{
必要なプロパティが存在する場合("id"
、"email"
)、対応するオプションをallOf
に渡します。
minProperties: number
(および必要に応じてmaxProperties: number
)を使用できます。これにより、スキーマ定義が短縮されます。
{
type: "object",
minProperties: 1,
properties: [/* your actual properties definitions */],
}
ドキュメントへのリンク: https://json-schema.org/understanding-json-schema/reference/object.html#size