Tùy thuộc vào tình huống của bạn, có một vài cách tiếp cận khác nhau. Tôi có thể nghĩ ra bốn cách khác nhau để yêu cầu một trường có điều kiện.
Sự phụ thuộc
Các dependencies
từ khóa là một biến thể có điều kiện của các required
từ khóa. Báo trước thuộc tính trong dependencies
, nếu thuộc tính có trong JSON đang được xác thực, thì lược đồ được liên kết với khóa đó cũng phải hợp lệ. Nếu có thuộc tính "foo", thì thuộc tính "bar" là bắt buộc
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
Cũng có một dạng rút gọn nếu lược đồ chỉ chứa required
từ khóa.
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
Hàm ý
Nếu điều kiện của bạn phụ thuộc vào giá trị của một trường, bạn có thể sử dụng khái niệm logic boolean được gọi là hàm ý. "A ngụ ý B" có nghĩa là, nếu A đúng thì B cũng phải đúng. Hàm ý cũng có thể được diễn đạt là "! A hoặc B". Thuộc tính "foo" không bằng "bar" hoặc thuộc tính "bar" là bắt buộc . Hay nói cách khác: Nếu thuộc tính "foo" bằng "bar", thì thuộc tính "bar" là bắt buộc
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
Nếu "foo" không bằng "bar", #/anyOf/0
kết quả khớp và xác thực sẽ thành công. Nếu "foo" bằng "bar", #/anyOf/0
không thành công và #/anyOf/1
phải có giá trị để anyOf
xác thực thành công.
Enum
Nếu điều kiện của bạn dựa trên enum, thì sẽ dễ dàng hơn một chút. "foo" có thể là "bar" hoặc "baz". Nếu "foo" bằng "bar", thì "bar" là bắt buộc. Nếu "foo" bằng "baz", thì "baz" là bắt buộc.
{
"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"]
}
]
}
Nếu-Thì-Khác
Một sự bổ sung tương đối mới để JSON Schema (draft-07) cho biết thêm if
, then
và else
từ khóa. Nếu thuộc tính "foo" bằng "bar", thì thuộc tính "bar" là bắt buộc
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
CHỈNH SỬA 23/12/2017: Đã cập nhật phần hàm ý và thêm phần If-Then-Else.
CHỈNH SỬA 06/04/2018: Sửa lỗi cho If-Then-Else và cập nhật singleton enum
s để sử dụng const
.