2012-01-27 16 views
30

स्कैंडमा ड्राफ्ट 03 के साथ यह संभव है, तो आश्चर्य की बात है। मुझे अन्यत्र काम करने वाली निर्भरताएं मिली हैं, मुझे लगता है कि उपयोग करने के लिए संभवतः उनमें से कुछ रचनात्मक उपयोग हैं उन्हें कुछ क्षेत्र की required संपत्ति निर्दिष्ट करने के लिए।JSON Schema - निर्दिष्ट फ़ील्ड किसी अन्य फ़ील्ड के मान के आधार पर आवश्यक है

मेरा वर्तमान सर्वोत्तम प्रयास (जो काम नहीं करता है) आपको मुझे इसके बारे में कुछ जानकारी देना चाहिए। मैं डिफ़ॉल्ट रूप से आवश्यक मान चाहता हूं, और वैकल्पिक जब किसी अन्य फ़ील्ड का कोई विशेष मान हो।

{ 
    "description" : "An address...", 
    "type" : "object", 
    "properties" : { 
     "postcode": { 
      "type" : "string", 
      // postcode should be required by default 
      "required" : true,  
      // postcode shouldn't be required if the country is new zealand 
      "dependencies" : { 
       "country" : { 
        "enum" : ["NZ", "NZL", "NEW ZEALAND"] 
       }, 
       "postcode" : { 
        "required" : false  
       } 
      } 
     }, 
     "country": { 
      "type" : "string", 
      "enum" : [ 
       // various country codes and names... 
      ], 
      "default" : "AUS" 
     } 
    } 
} 

उत्तर

25

यह ड्राफ्ट के संस्करण 3 के साथ निश्चित रूप से संभव है। जब से तुम अनुमति उन देशों की पूरी सूची है, तो आप कुछ इस तरह कर सकता है:

{ 
    "type": [ 
     { 
      "title": "New Zealand (no postcode)", 
      "type": "object", 
      "properties": { 
       "country": {"enum": ["NZ", "NZL", "NEW ZEALAND"]} 
      } 
     }, 
     { 
      "title": "Other countries (require postcode)", 
      "type": "object", 
      "properties": { 
       "country": {"enum": [<all the other countries>]}, 
       "postcode": {"required": true} 
      } 
     } 
    ], 
    "properties": { 
     "country": { 
      "type" : "string", 
      "default" : "AUS" 
     }, 
     "postcode": { 
      "type" : "string" 
     } 
    } 
} 

तो आप वास्तव में अपने स्कीमा के लिए दो उप-प्रकार, जिन देशों ने एक पोस्टकोड की आवश्यकता के लिए, और देशों के लिए एक परिभाषित है कि ऐसा न करें।

EDIT - v4 समकक्ष बेहद समान है। बस "oneOf" पर शीर्ष-स्तर "type" सरणी का नाम बदलें। इस तरह से play-options में

{ 
    "type": "object", 
    "properties": { 
     "play": { 
      "type": "boolean" 
     }, 
     "play-options": { 
      "type": "string" 
     } 
    }, 
    "dependencies": { 
     "play-options": { 
      "properties": { 
       "play": { 
        "enum": [true] 
       } 
      } 
     } 
    } 
} 

हमेशा true होने की play मूल्य की आवश्यकता होगी:

+5

यह ध्यान देने योग्य है कि संस्करण 4 में, 'टाइप' कीवर्ड में स्कीमा डालने से मना कर दिया जाएगा। आप शायद 'allOf' या' oneOf' का उपयोग करना चाहते हैं। – cloudfeet

+0

विनिर्देश के संस्करण 4 में क्या है? – Relequestual

+1

मैं v4 विकल्पों को स्पष्ट करने के उत्तर में कुछ जोड़ूंगा – cloudfeet

2

मैंने बस spec के 03 संस्करण को देखा और मुझे नहीं लगता कि आप जो वर्णन कर रहे हैं वह संभव है। यह निश्चित रूप से "सरल निर्भरता" नहीं है और "स्कीमा निर्भरता" का विवरण संपत्ति के मूल्य पर विचार करने का कोई भी उल्लेख नहीं करता है।

ऐसा लगता है कि आपको "सशर्त स्कीमा निर्भरता" की आवश्यकता है।

क्या सरल के साथ संभव है की कुछ चर्चा नहीं है और स्कीमा यहाँ निर्भरताएँ: http://groups.google.com/group/json-schema/msg/8145690ebb93963b

आप अगर वहाँ सशर्त निर्भरता का समर्थन करने की योजना है कि समूह पूछ सकते हैं।

+0

शानदार, लिंक के लिए धन्यवाद। ऐसा लगता है कि जेएसओएन स्कीमा इस समय अपने बचपन में काफी ज्यादा है, किसी भी प्रकार का दस्तावेज ढूंढना मुश्किल है! ><मुझे लगता है कि वास्तव में क्या आवश्यक है निर्भरता के लिए एक स्कीमा के मूल गुणों में हेरफेर करने का एक तरीका है - यह निर्भरताओं के साथ-साथ कई अन्य संभावित चाल के माध्यम से डिफ़ॉल्ट मानों और आवश्यकताओं को ओवरराइड करने की अनुमति देगा। – pospi

+0

उत्तर में दिए गए लिंक में एक बहुत ही मूल्यवान और व्यावहारिक उदाहरण है! यह शर्म की बात है कि spec के प्रत्येक भाग के लिए बेहतर दस्तावेज़ीकरण/अधिक व्यावहारिक उदाहरण नहीं हैं। – Relequestual

10

किसी मसौदा 4 के लिए एक समाधान की तलाश में है, तो आप dependencies कीवर्ड एक साथ एक enum कीवर्ड के साथ उपयोग कर सकते हैं।

+0

हाँ, यह काम करता है। धन्यवाद। यदि आप '' '{ " play को अमान्य करने का तरीका बताते हैं तो यह सहायक होगा: सत्य } '' '। यही है, अगर शर्त संतुष्ट होती है तो प्ले-विकल्प की आवश्यकता होती है। – Nilesh

+0

@Nilesh क्षमा करें, आप क्या हासिल करना चाहते हैं? – ppalacios

+3

मुझे नहीं लगता कि यह सवाल का जवाब देता है। उत्तर में निर्भरता का अर्थ है कि 'play-options' मौजूद है, 'play'' true' होना चाहिए। लेकिन जब 'play' 'true' है, तो' play-options 'मौजूद नहीं है। – Sisyphus

0

'आईडी' के साथ निर्भरता उपयोग करके देखें:

{ 
    "title": "Test dependncies", 
    "readOnly": false, 
    "$schema": "http://json-schema.org/draft-04/hyper-schema", 
    "description": "This a test to show how we can use dependencies in json schema", 
    "properties":{ 
     "graduate": { 
      "title":"Graduate?", 
      "type":"string", 
      "enum":["Yes","No"], 
      "options": { 
      "dependencies":[ 
       {"id":"minimumEligibilityAge","value":"Yes"}, 
       {"id":"courseName","value":"No"} 
       ] 
      } 
     }, 
     "minimumEligibilityAge":{ 
      "id":"minimumEligibilityAge", 
      "title":"Enter Age", 
      "type":"number", 
      "options":{"hide_display":true} 
      }, 
     "courseName":{ 
      "id":"courseName", 
      "title":"Enter Graduation Course Name", 
      "type":"string" 
     } 
    }, 
    "type": "object" 
} 

तो स्नातक के मान हाँ है, यह minimumEligibilityAge की आवश्यकता है। यदि स्नातक का मूल्य नहीं है, तो उसे पाठ्यक्रम के लिए धन्यवाद

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