มีแนวทางที่แตกต่างกันเล็กน้อยขึ้นอยู่กับสถานการณ์ของคุณ ฉันคิดได้สี่วิธีในการกำหนดฟิลด์ตามเงื่อนไข
การพึ่งพา
dependencies
คำหลักคือการเปลี่ยนแปลงเงื่อนไขของrequired
คำหลัก คุณสมบัติ Foreach ในdependencies
หากคุณสมบัติมีอยู่ใน JSON ที่กำลังตรวจสอบความถูกต้องสคีมาที่เชื่อมโยงกับคีย์นั้นจะต้องถูกต้องด้วย หากมีคุณสมบัติ "foo" แสดงว่าต้องมีคุณสมบัติ "bar"
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
นอกจากนี้ยังมีรูปแบบสั้น ๆ หากสคีมามีเฉพาะrequired
คำหลัก
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
นัย
ถ้าเงื่อนไขของคุณขึ้นอยู่กับค่าของเขตข้อมูลคุณสามารถใช้แนวคิดตรรกะบูลีนที่เรียกว่านัย "A หมายถึง B" หมายความว่าอย่างมีประสิทธิภาพถ้า A เป็นจริง B ก็ต้องเป็นจริงด้วย ความหมายยังสามารถแสดงเป็น "! A หรือ B" ทั้งคุณสมบัติ "foo" ไม่เท่ากับ "บาร์" หรือทรัพย์สิน "บาร์" เป็นสิ่งจำเป็น หรืออีกนัยหนึ่ง: ถ้าคุณสมบัติ "foo" เท่ากับ "bar" ก็ต้องระบุคุณสมบัติ "bar"
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
หาก "foo" ไม่เท่ากับ "bar" การ#/anyOf/0
จับคู่และการตรวจสอบความถูกต้องจะสำเร็จ หาก "foo" เท่ากับ "bar" #/anyOf/0
ล้มเหลวและ#/anyOf/1
ต้องถูกต้องเพื่อให้การanyOf
ตรวจสอบความถูกต้องสำเร็จ
Enum
หากเงื่อนไขของคุณเป็นไปตาม enum ก็จะตรงไปตรงมาอีกเล็กน้อย "foo" อาจเป็น "bar" หรือ "baz" ก็ได้ ถ้า "foo" เท่ากับ "bar" ก็ต้องระบุ "bar" ถ้า "foo" เท่ากับ "baz" ก็ต้องระบุ "baz"
{
"type": "object",
"properties": {
"foo": { "enum": ["bar", "baz"] },
"bar": { "type": "string" },
"baz": { "type": "string" }
},
"anyOf": [
{
"properties": {
"foo": { "const": "bar" }
},
"required": ["bar"]
},
{
"properties": {
"foo": { "const": "baz" }
},
"required": ["baz"]
}
]
}
ถ้า - แล้ว - อื่น ๆ
นอกจากนี้ค่อนข้างใหม่JSON Schema (ร่าง-07)เพิ่มif
, then
และelse
คำหลัก ถ้าคุณสมบัติ "foo" เท่ากับ "bar" ก็ต้องระบุคุณสมบัติ "bar"
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
แก้ไข 12/23/2017:ส่วนการแสดงนัยได้รับการอัปเดตและเพิ่มส่วน If-Then-Else
แก้ไข 2018/06/04:แก้ไขข้อผิดพลาดสำหรับหาก-แล้ว-อื่น ๆ และการปรับปรุงเดี่ยวenum
S const
ใช้