2015-08-05 4 views
23

की आवश्यकता है, मैं जानना चाहता हूं कि मैं एक JSON स्कीमा (ड्राफ्ट 4) को परिभाषित कर सकता हूं जिसके लिए किसी ऑब्जेक्ट के लिए कम से कम एक गुण संभव है। मुझे पहले से ही allOf, anyOf और oneOf पता है, लेकिन यह पता नहीं लगा सकता कि मैं जिस तरह से उपयोग करना चाहता हूं उसका उपयोग कैसे करें।एक JSON स्कीमा को परिभाषित करने के लिए, जिसमें कम से कम एक गुण

यहाँ 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 (भी उन दोनों को स्वीकार करने) की आवश्यकता होती है और अभी भी प्रारूप के अनुसार सत्यापन पूर्ण करना चाहते हैं।

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

आप मेरी मदद कर सकते हैं कि कैसे करने के लिए: oneOf का उपयोग सत्यापन विफल हो जाता है, तो मैं दोनों (परीक्षण 3), anyOf गुजरता सत्यापन भले ही उनमें से एक मान्य नहीं है (परीक्षण 4) प्रदान

यहाँ मेरी स्कीमा है मेरे उपयोग के मामले के लिए सही सत्यापन प्राप्त करें?

उत्तर

40

सम्पत्तियों का एक समूह के कम से कम एक की आवश्यकता होती है करने के लिए, anyOf विकल्पों की एक श्रृंखला के अंदर required का उपयोग करें:

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

तो गुण आप चाहते हैं के किसी भी मौजूद है ("id", "email"), तो यह पारित करेंगे संबंधित विकल्प allOf में।

संबंधित मुद्दे