2015-08-05 15 views
23

Tôi muốn biết liệu tôi có thể xác định lược đồ JSON (bản nháp 4) yêu cầu ít nhất một trong nhiều thuộc tính có thể cho một đối tượng hay không. Tôi đã biết về allOf, anyOfoneOf nhưng không thể tìm ra cách sử dụng chúng theo cách tôi muốn.Cách xác định giản đồ JSON yêu cầu ít nhất một trong nhiều thuộc tính

Dưới đây là một số ví dụ để minh họa 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" 
} 

Tôi muốn yêu cầu ít nhất id hoặc email (cũng chấp nhận cả hai) và vẫn vượt qua xác nhận theo định dạng. Sử dụng oneOf không xác nhận nếu tôi cung cấp cả xác nhận (kiểm tra 3), anyOf đi ngay cả khi một trong số họ là không hợp lệ (kiểm tra 4)

Dưới đây là sơ đồ của tôi:

{ 
    "$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" 
       } 
      } 
     } 
    ] 
} 

Bạn có thể giúp tôi làm thế nào để đạt được xác nhận chính xác cho trường hợp sử dụng của tôi?

Trả lời

40

Yêu cầu ít nhất một trong một tập hợp các tài sản, sử dụng required bên trong một loạt các anyOf lựa chọn:

{ 
    "type": "object", 
    "anyOf": [ 
     {"required": ["id"]}, 
     {"required": ["email"]} 
     // any other properties, in a similar way 
    ], 
    "properties": { 
     // Your actual property definitions here 
    } 
{ 

Nếu bất kỳ thuộc tính bạn muốn hiện diện ("id", "email"), sau đó nó sẽ vượt qua tùy chọn tương ứng trong allOf.

Các vấn đề liên quan