2013-04-18 5 views
16

मैं संलग्न JSON डेटा और स्कीमा को सत्यापित करने के लिए वैधता का उपयोग कर रहा हूं। अब तक काम कर रहा है।मनमानी कुंजी के साथ JSON स्कीमा सत्यापन

हालांकि डेटा डिक्शनरी में मनमानी स्ट्रिंग कुंजियां हो सकती हैं ('बीपी' के अलावा अन्य)। यहां स्कीमा में कुंजी 'बीपी' हार्ड-कोडेड है ... यह किसी दिए गए सूची (स्ट्रिंग के enum) से एक स्ट्रिंग हो सकती है। मैं यहां "प्रथम स्तर" के लिए enum परिभाषा कैसे जोड़ूं।

import json 
import validictory 

data = {'bp': [{'category': 'bp', 
     'created': '2013-03-08T09:14:48.148000', 
     'day': '2013-03-11T00:00:00', 
     'id': 'dc049c0e-d19a-4e3e-93ea-66438a239712', 
     'unit': 'mmHg', 
     'value': 147.0, 
     'value2': 43.0}]} 


schema = { 
    "type":"object", 
    "properties":{ 
     "bp": { 
      "type":"array", 
      "required":False, 
      "items": 
       { 
        "type":"object", 
        "required":False, 
        "properties":{ 
         "category": { 
          "type":"string", 
          "default": "bp", 
          "required":False 
         }, 
         "created": { 
          "type":"string", 
          "default": "2013-03-08T09:14:48.148000", 
          "required":False 
         }, 
         "day": { 
          "type":"string", 
          "default": "2013-03-11T00:00:00", 
          "required":False 
         }, 
         "id": { 
          "type":"string", 
          "default": "dc049c0e-d19a-4e3e-93ea-66438a239712", 
          "required":False 
         }, 
         "unit": { 
          "type":"string", 
          "default": "mmHg", 
          "required":False 
         }, 
         "value2": { 
          "type":"number", 
          "default":43, 
          "required":False 
         }, 
         "value": { 
          "type":"number", 
          "default":147, 
          "required":False 
         } 
        } 
       } 


     } 
    } 
} 

validictory.validate(data,schema) 
+0

क्या आप हमें दिखा सकते हैं कि समस्या को पुन: उत्पन्न कैसे करें? मुझे अभी कोई नहीं दिख रहा है। – jsalonen

+1

@jsalonen: समस्या यह है कि ओपी इनपुट को मान्य करना चाहता है यदि शीर्ष-स्तरीय कुंजी 'बीपी' से अलग है। मुझे लगता है कि समस्या का विवरण पर्याप्त स्पष्ट है, और JSON-schema अनुभव वाला कोई व्यक्ति मदद करने में सक्षम होना चाहिए। –

+0

आह सही। धन्यवाद। – jsalonen

उत्तर

29

यह वास्तव में निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

आप एक ही विनिर्देश चाहते हैं, लेकिन संपत्तियों की एक श्रृंखला के लिए, आप यह पता परिभाषा सार कर सकते हैं:

:

{ 
    "type": "object", 
    "properties": { 
     "bp": {"$ref": "#/definitions/categoryList"}, 
     "foo": {"$ref": "#/definitions/categoryList"}, 
     "bar": {"$ref": "#/definitions/categoryList"} 
    }, 
    "definitions": { 
     "categoryList": {...} 
    } 
} 

आपको लगता है कि स्कीमा का पालन करना चाहते हैं किसी भी गुण, आप additionalProperties उपयोग कर सकते हैं

{ 
    "type": "object", 
    "additionalProperties": {...} 
} 

या गुण की एक सीमा (एक पैटर्न के अनुरूप) - उदाहरण के लिए, कुछ भी लोअर केस:

{ 
    "type": "object", 
    "patternProperties": { 
     "^[a-z]+$": {...} 
    } 
} 

आप प्रॉपर्टी की संख्या कि परिभाषित किया जा सकता है, तो आप "maxProperties" (केवल मानक के v4) का उपयोग कर सकते सीमित करना चाहते हैं:

{ 
    "type": "object", 
    "additionalProperties": {...}, 
    "maxProperties": 1 
} 

पी.एस. - मानक के v4 में, "आवश्यक" एक सरणी है। वास्तव में, यहां तक ​​कि v3 में, "आवश्यक" false पर डिफ़ॉल्ट है, इसलिए आपके उदाहरण को इसकी आवश्यकता नहीं है

+2

पैटर्नप्रॉपर्टीज ने नौकरी –

+0

किया था, मुझे यह कहना चाहिए कि यदि यह संभव कुंजी का एक निश्चित सेट है (उदा। 10 या तो), तो पहला विकल्प शायद सबसे वर्णनात्मक है। हालांकि, यदि उनमें से कोई अनंत (या बहुत बड़ी) सीमा है, तो 'पैटर्नप्रॉपर्टीज' निश्चित रूप से जाने का तरीका है। – cloudfeet

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