2014-06-20 11 views
6

को छोड़कर बहु-विशिष्ट गुणों का एक सेट बनाने के लिए मेरे पास एक विरासत API है जो मैं JSON स्कीमा में परिभाषित करने की कोशिश कर रहा हूं और ऑब्जेक्ट में एक अजीब संरचना है जहां 4 गुणों का एक सेट है, उनमें से कोई भी आवश्यक है, और उनमें से 3 पारस्परिक रूप से अनन्य हैं। इसके बाद 30 से अधिक साझा वैकल्पिक गुण भी हैं, मैं उन्हें ... के रूप में नोट कर दूंगा।किसी भी

जैसे,

{ "foo": "bar", "baz": 1234, ... } // OK 
{ "foo": "bar", "buzz": 1234, ... } // OK 
{ "foo": "bar", "fizz": 1234, ... } // OK 
{ "foo": 1234, ... }    // OK 
{ "baz": 1234, ... }    // OK 
{ ... }        // NOT OK 
{ "baz": 1234, "buzz": 1234, ... } // NOT OK 

मैं एक oneOf कर सकता है लेकिन यह है कि foo अन्य लोगों के साथ उपस्थित रहने की अनुमति नहीं है, anyOfbaz, buzz, और fizz के लिए एक दूसरे के साथ उपस्थित होने का जो नहीं है की अनुमति देता है मुमकिन।

{ 
    "type": "object", 
    "properties": { 
     "foo": {"type": "string"}, 
     "baz": {"type": "number"}, 
     "buzz": {"type": "number"}, 
     "fizz": {"type": "number"} 
    }, 
    "anyOf": [ 
     {"required": ["foo"]}, 
     {"required": [{"oneOf": [ 
       {"required": ["baz"]}, 
       {"required": ["buzz"]}, 
       {"required": ["fizz"]} 
      ]} 
     ]}    
    ] 
} 

और

{ 
    "type": "object", 
    "properties": { 
     "foo": {"type": "string"}, 
     "baz": {"type": "number"}, 
     "buzz": {"type": "number"}, 
     "fizz": {"type": "number"} 
    }, 
    "anyOf": [ 
     {"required": ["foo"]}, 
     {"oneOf": [ 
       {"required": ["baz"]}, 
       {"required": ["buzz"]}, 
       {"required": ["fizz"]} 
      ] 
     }    
    ] 
} 

लेकिन वह काम नहीं करता और मैं बस json स्कीमा के बारे में पर्याप्त जानकारी नहीं है अभी तक यह संभव है, तो पता करने के लिए:

मैं की तरह कुछ निम्नलिखित को परिभाषित करने की कोशिश की ।

उत्तर

11

दिलचस्प! वहाँ एक neater समाधान हो सकता है, लेकिन यहाँ हम चले ...

"परस्पर अनन्य" बाधा गुण जोड़ो में संयोजन पर प्रतिबंध लगाने को व्यक्त किया जा सकता:

{ 
    "not": { 
     "anyOf": [ 
      {"required": ["baz", "buzz"]}, 
      {"required": ["buzz", "fizz"]}, 
      {"required": ["fizz", "baz"]} 
     ] 
    } 
} 

बाधा "कम से कम में से एक" anyOf साथ व्यक्त किया जा सकता:

{ 
    "anyOf": [ 
     {"required": ["foo"]}, 
     {"required": ["baz"]}, 
     {"required": ["buzz"]}, 
     {"required": ["fizz"]} 
    } 
} 

आप सिर्फ एक स्कीमा में इन दोनों की कमी गठबंधन है, तो यह काम करना चाहिए:

{ 
    "not": {"anyOf": [...]}, 
    "anyOf": ... 
} 
+1

मुझे पूरा यकीन है कि यह मुझे सिर खरोंच और क्रोध के अनगिनत घंटे बचाता है। दुबई होटल की छत पर आपके मिसस के साथ आप $ 5000 डिनर के लायक हैं। आपका बहुत बहुत धन्यवाद! – dimitarvp

2

आप जेएसओएन स्कीमा में जोड़ों के बहिष्कार का उपयोग करके पारस्परिक रूप से अनन्य गुण बना सकते हैं, लेकिन इससे संयोजन संयोजन होता है। यह एक समस्या बन जाती है जब आपके पास कई परस्पर अनन्य गुण होते हैं।

एक रेखीय समाधान फार्म की है:

  • संपत्ति एक
  • संपत्ति ख
  • संपत्ति ग
  • के किसी भी नहीं:
      • में से एक संपत्ति
      • संपत्ति ख
      • संपत्ति ग

यह केवल भुगतान करती है, तो आप कई गुण होते हैं।

{ "oneOf": [ 
    { "required": ["baz"] }, 
    { "required": ["buzz"] }, 
    { "required": ["fizz"] }, 
    { "not": 
    { "anyOf": [ 
     { "required": ["baz"] }, 
     { "required": ["buzz"] }, 
     { "required": ["fizz"] } 
    ] } 
    } 
] } 

अपने विशिष्ट प्रश्न का उत्तर पाने के लिए @ क्लाउडफीट के उत्तर के साथ इसे संयोजित करें।

+1

यह शायद सबसे अच्छा जवाब है। – Devin

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