jsonSchema सशर्त रूप से आवश्यक विशेषता


96

JsonSchema में आप यह बता सकते हैं कि परिभाषित फ़ील्ड अनिवार्य हैं या requiredविशेषता का उपयोग नहीं कर रहे हैं :

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "header": {
            "type": "object",
            "properties": {
                "messageName": {
                    "type": "string"
                },
                "messageVersion": {
                    "type": "string"
                }
            },
            "required": [
                "messageName",
                "messageVersion"
            ]
        }
    },
    "required": [
        "header"
    ]
}

कुछ मामलों में, मैं चाहूंगा कि messageVersionक्षेत्र अनिवार्य न हो। क्या इस क्षेत्र की स्थिति के अनिवार्य-नेस बनाने का कोई तरीका है?


हां, यह संभव होना चाहिए। डेटा में कौन सी जानकारी अनिवार्य-नेस को ट्रिगर करेगी?
१६:

@ सरवेश्वरनमक्षी शंकरम - मुझे नहीं पता कि मैंने केवल
j4

क्या यह संस्करण 3 में बिल्कुल संभव है?
सर्वेश

@ सर्वेश्वरनमीक्षीशुंदरम - मुझे नहीं पता। यह कोशिश करो और हमें पता है कृपया!
टॉम

जवाबों:


261

आपकी स्थिति के आधार पर, कुछ अलग तरीके हैं। मैं सशर्त रूप से एक क्षेत्र की आवश्यकता के चार अलग-अलग तरीकों के बारे में सोच सकता हूं।

निर्भरता

dependenciesकीवर्ड का एक सशर्त भिन्नता है requiredकीवर्ड। Foreach प्रॉपर्टी dependencies, अगर JSON में प्रॉपर्टी को वेरिफाई किया जा रहा है, तो उस की से जुड़ी स्कीमा भी मान्य होनी चाहिए। यदि "फू" संपत्ति मौजूद है, तो "बार" संपत्ति की आवश्यकता है

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

निहितार्थ

यदि आपकी स्थिति किसी क्षेत्र के मूल्य पर निर्भर करती है, तो आप एक बूलियन लॉजिक अवधारणा का उपयोग कर सकते हैं जिसे निहितार्थ कहा जाता है। "ए का अर्थ बी" प्रभावी रूप से होता है, यदि ए सत्य है तो बी भी सत्य होना चाहिए। इम्प्लांटेशन को "ए! बी" के रूप में भी व्यक्त किया जा सकता है। या तो "फू" संपत्ति "बार" के बराबर नहीं है, या "बार" संपत्ति की आवश्यकता है । या, दूसरे शब्दों में: यदि "फू" संपत्ति "बार" के बराबर है, तो "बार" संपत्ति की आवश्यकता है

{
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "string" }
  },
  "anyOf": [
    {
      "not": {
        "properties": {
          "foo": { "const": "bar" }
        },
        "required": ["foo"]
      }
    },
    { "required": ["bar"] }
  ]
}

यदि "फू" "बार" के बराबर नहीं है, तो #/anyOf/0मिलान और सत्यापन सफल होता है। यदि "फू" "बार" के बराबर है, तो #/anyOf/0विफल #/anyOf/1होना चाहिए और anyOfसत्यापन सफल होने के लिए वैध होना चाहिए ।

enum

यदि आपकी सशर्त एक एनम पर आधारित है, तो यह थोड़ा और सीधे आगे है। "फू" "बार" या "बाज" हो सकता है। यदि "फू" "बार" के बराबर है, तो "बार" की आवश्यकता है। यदि "फू" "बाज" के बराबर है, तो "बाज" की आवश्यकता है।

{
  "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 स्कीमा (ड्राफ्ट -07) के लिए एक अपेक्षाकृत नया अतिरिक्त if, thenऔर elseकीवर्ड जोड़ता है । यदि "फू" संपत्ति "बार" के बराबर है, तो "बार" संपत्ति की आवश्यकता है

{
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "string" }
  },
  "if": {
    "properties": {
      "foo": { "const": "bar" }
    },
    "required": ["foo"]
  },
  "then": { "required": ["bar"] }
}

EDIT 12/23/2017: इम्प्लीकेशन सेक्शन अपडेट किया गया और इफ-तब-एल्स सेक्शन जोड़ा गया।

EDIT 06/04/2018: इफ-एल्स-एल्स के लिए बगफिक्स और सिंगलटन enumका उपयोग करने के लिए अपडेट करें const


7
@ कॉन्बुबो मैं if-then-elseकीवर्ड्स का प्रशंसक नहीं हूं और मैं उन्हें इस्तेमाल करने से मना करता हूं। लेकिन, यदि आप इसका उपयोग करना चुनते हैं, तो मेरा सुझाव है कि हमेशा उन्हें एक में लपेटें allOfजिसमें केवल तीन कीवर्ड हों। { ...other_keywords..., "allOf": [{ "if": ..., "then": ..., "else": ... }], ...more_keywords... }
जेसन डेसरोयर्स

2
@ जेसन प्रशंसक क्यों नहीं if...? मुझे लगता है कि आपके उत्तर में इस पर एक संक्षिप्त राय पूरी तरह से उचित होगी। या यह एक लंबी कहानी है?
क्ले ब्रिजेज

6
@ClayBridges टिप्पणी अनुभाग उस चर्चा के लिए सही स्थान नहीं है, लेकिन यहां संक्षिप्त संस्करण है। एक सामान्य नियम के रूप में, JSON स्कीमा कीवर्ड स्टेटलेस हैं। उदाहरण को मान्य करने के लिए कीवर्ड मान के अलावा किसी भी जानकारी का उपयोग नहीं किया जा सकता है। if, thenऔर elseइस नियम का उल्लंघन करते हैं , क्योंकि वे एक-दूसरे पर निर्भर हैं।
जेसन डेसरियर्स

3
@Girard, यह JSON स्कीमा में इन पैटर्नों के उपयोग का सबसे अच्छा उपचार है जिससे मैं अवगत हूं। बूलियन संचालन को आधिकारिक रूप से प्रलेखित किया जाता है, लेकिन बाकी सिर्फ गणित है। allOf== और, anyOf== या, oneOf== XOR, और not== नहीं। आप गणित सामग्री पर अधिक संसाधनों (जैसे निहितार्थ) के लिए "बूलियन बीजगणित" को Google कर सकते हैं।
जेसन देसोस्सिएर

2
@AlexeyShrub मैं थोड़ी देर के लिए इस बारे में लिखना चाहता हूं, लेकिन अन्य चीजों से विचलित हो गया हूं। मैं एक सशर्त के विचार का प्रशंसक हूं । इससे लोगों को समझने में आसानी होती है। मेरी आपत्ति उस तरह से है जैसे इसे तीन अलग-अलग स्टेटफुल कीवर्ड के रूप में परिभाषित किया गया था (पिछली टिप्पणी देखें)। उन कीवर्ड्स का होना, जो उन अन्य वास्तुशिल्प गुणों का उल्लंघन करते हैं, जो अन्य कीवर्ड अनुसरण करते हैं, JSON स्कीमा सत्यापनकर्ताओं को कार्यान्वित करने में कठिन और कम कुशल बनाते हैं। यदि सशर्त को एक अलग तरीके से परिभाषित किया गया था जो कि स्टेटलेस था, तो मुझे कोई आपत्ति नहीं होगी।
जेसन देसोस्सिएर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.