2012-05-30 22 views
22

मेरे JSON स्ट्रिंग स्वरूपित किया जाएगा के रूप में:वस्तुओं की सरणी के लिए JSON स्कीमा कैसे लिखें?

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     }, 
     { 
      "c":{"cx":4} 
     } 
    ] 
} 

data सरणी कई a और b और c शामिल हैं। और कोई अन्य प्रकार की वस्तुएं नहीं।

यदि count==0, data एक खाली सरणी [] होना चाहिए।

मैं रूबी में ऐसे JSON ऑब्जेक्ट्स को सत्यापित करने के लिए https://github.com/hoxworth/json-schema का उपयोग कर रहा हूं।

require 'rubygems' 
require 'json-schema' 

p JSON::Validator.fully_validate('schema.json',"test.json") 

schema.json है:

{ 
    "type":"object", 
    "$schema": "http://json-schema.org/draft-03/schema", 
    "required":true, 
    "properties":{ 
    "count": { "type":"number", "id": "count", "required":true }, 
    "data": { "type":"array", "id": "data", "required":true, 
     "items":[ 
      { "type":"object", "required":false, "properties":{ "a": { "type":"object", "id": "a", "required":true, "properties":{ "ax": { "type":"number", "id": "ax", "required":true } } } } }, 
      { "type":"object", "required":false, "properties":{ "b": { "type":"object", "id": "b", "required":true, "properties":{ "bx": { "type":"number", "id": "bx", "required":true } } } } }, 
      { "type":"object", "required":false, "properties":{ "c": { "type":"object", "id": "c", "required":true, "properties":{ "cx": { "type":"number", "id": "cx", "required":true } } } } } 
     ] 
    } 
    } 
} 

लेकिन जब मैं इसे विफल करना चाहिए लगता है test.json के लिए इस प्रमाणीकरण में सफल होगा:

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     }, 
     { 
      "c":{"cx":2} 
     }, 
     { 
      "c": {"z":"aa"} 
     } 
    ] 
} 

और यह test.json के रूप में असफल हो जायेगी, जबकि मुझे लगता है इसे पास करना चाहिए:

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     } 
    ] 
} 

लगता है कि गलत स्कीमा मान्य है कि data सरणी में a,b,c एक बार है।

सही स्कीमा क्या होना चाहिए?

+0

@Phrogz मैं सवाल को अद्यतन किया है। आप उदाहरण देख सकते हैं। –

उत्तर

30

JSON schema spec, सेक्शन 5.5 से। आइटम:

जब यह विशेषता मान स्कीमा की एक सरणी और उदाहरण
मूल्य एक सरणी है, उदाहरण के सरणी में प्रत्येक स्थिति
स्कीमा को यह सरणी के लिए इसी स्थिति में पालन करना चाहिए। यह
टुपल टाइपिंग कहा जाता है।

आपकी स्कीमा परिभाषा के लिए सरणी के पहले तीन तत्वों को वास्तव में 'ए', 'बी' और 'सी' तत्वों की आवश्यकता होती है। यदि items खाली छोड़ दिया गया है, तो किसी भी सरणी तत्व की अनुमति है। इसी प्रकार, यदि additionalItems खाली छोड़ दिया गया है, तो कोई अतिरिक्त सरणी तत्व अनुमति है।

आप क्या चाहते हैं पाने के लिए आपको "additionalItems": false निर्दिष्ट करने की आवश्यकता और items के लिए, मुझे लगता है कि निम्नलिखित (कुछ अपने परिभाषाओं से छोटा) काम करना चाहिए:

"items": { 
    "type": [ 
    {"type":"object", "properties": {"a": {"type": "object", "properties": {"ax": { "type":"number"}}}}}, 
    {"type":"object", "properties": {"b": {"type": "object", "properties": {"bx": { "type":"number"}}}}}, 
    {"type":"object", "properties": {"c": {"type": "object", "properties": {"cx": { "type":"number"}}}}} 
    ] 
} 
+1

यह मेरे लिए काम करता है, धन्यवाद –

+1

क्या यह "प्रकार" का उपयोग करने का सही तरीका है? "आइटम" का मूल्य सरणी के बजाय नहीं होगा? –

+0

@ कॉन्फ्यूजन, इसे फिर से खोलने के लिए खेद है, लेकिन प्रस्तावित समाधान काम नहीं करता है; इसलिए उदाहरण के लिए मेरे पास 'डेटा' सरणी में प्रस्तावित ऑब्जेक्ट्स में से 3 से अधिक होना चाहिए, तो स्कीमा सत्यापन विफल हो जाता है ... किसी भी विचार को हल करने का तरीका क्या है? – jtimz