2016-01-24 33 views
0

當試圖驗證使用http://www.jsonschemavalidator.net/下面的架構,JSONSchema V4 - 解決方案引用時錯誤 - 定義和引用

{ 
    "id": "http://some.site.somewhere/entry-schema#", 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "description": "schema for the FormularSpecification", 
    "definitions": { 
     "elementId": { 
      "id": "http://jsonschema.net/elementId", 
      "type": "string" 
     }, 
     "mappingKey": { 
      "id": "http://jsonschema.net/mappingKey", 
      "type": "string" 
     }, 
     "elementType": { 
      "id": "http://jsonschema.net/elementType", 
      "type": "string" 
     }, 
     "length": { 
      "id": "http://jsonschema.net/length", 
      "type": "integer" 
     }, 
     "label": { 
      "id": "http://jsonschema.net/label", 
      "type": "string" 
     }, 
     "content": { 
      "id": "http://jsonschema.net/content", 
      "type": "string" 
     }, 
     "placeholder": { 
      "id": "http://jsonschema.net/placeholder", 
      "type": "string" 
     }, 
     "date": { 
      "id": "http://jsonschema.net/date", 
      "type": "string" 
     }, 
     "option": { 
      "id": "http://jsonschema.net/option", 
      "type": "object", 
      "properties": { 
       "elementId": { "$ref": "#/definitions/elementId" }, 
       "label": { "$ref": "#/definitions/label" } 
      }, 
      "required": ["elementId", "label"] 
     }, 
     "options": { 
      "id": "http://jsonschema.net/options", 
      "type": "array", 
      "items": { "$ref": "#/definitions/option" }, 
      "minItems": 1, 
      "uniqueItems": true 
     }, 
     "textfield": { 
      "id": "http://jsonschema.net/textfield", 
      "type": "object", 
      "properties": { 
       "elementId": { "$ref": "#/definitions/elementId" }, 
       "length": { "$ref": "#/definitions/length" }, 
       "label": { "$ref": "#/definitions/label" }, 
       "placeholder": { "$ref": "#/definitions/placeholder" }, 
       "textfieldType": { 
        "enum": [ "text", "ext4", "btrfs" ] 
       } 
      }, 
      "required": ["elementId", "length", "label", "placeholder", "textfieldType"] 
     }, 
     "checkbox": { 
      "id": "http://jsonschema.net/checkbox", 
      "type": "object", 
      "properties": { 
       "label": { "$ref": "#/definitions/label" } 
      }, 
      "required": ["label"] 
     }, 
     "radio": { 
      "id": "http://jsonschema.net/radio", 
      "type": "object", 
      "properties": { 
       "label": { "$ref": "#/definitions/label" }, 
       "options": { "$ref": "#/definitions/options" } 
      }, 
      "required": ["label", "options"] 
     }, 
     "dropdown": { 
      "id": "http://jsonschema.net/dropdown", 
      "type": "object", 
      "properties": { 
       "label": { "$ref": "#/definitions/label" }, 
       "options": { "$ref": "#/definitions/options" } 
      }, 
      "required": ["label", "options"] 
     }, 
     "validator": { 
      "id": "http://jsonschema.net/validator", 
      "type": "object", 
      "properties": { 
       "elementId": { "$ref": "#/definitions/elementId" } 
      } 
     }, 
     "validators": { 
      "id": "http://jsonschema.net/validators", 
      "type": "array", 
      "items": { "$ref": "#/definitions/validator" } 
     }, 
     "interactiveDetails": { 
      "type": "object", 
      "oneOf": [ 
       { "textfield": { "$ref": "#/definitions/textfield" } }, 
       { "checkbox": { "$ref": "#/definitions/checkbox" } }, 
       { "radio": { "$ref": "#/definitions/radio" } }, 
       { "dropdown": { "$ref": "#/definitions/dropdown" } }, 
       { "date": { "$ref": "#/definitions/date" } } 
      ] 
     }, 
     "interactive": { 
      "id": "http://jsonschema.net/interactive", 
      "type": "object", 
      "properties": { 
       "elementId": { "$ref": "#/definitions/elementId" }, 
       "elementType": { "$ref": "#/definitions/elementType" }, 
       "mappingKey": { "$ref": "#/definitions/mappingKey" }, 
       "validators": { "$ref": "#/definitions/validators" }, 
       "interactiveDetails" : { "$ref": "#/definitions/interactiveDetails" } 
      }, 
      "required": ["elementId", "elementType", "mappingKey", "validators"] 
     }, 
     "interactives": { 
      "id": "http://jsonschema.net/interactives", 
      "type": "array", 
      "items": { "$ref": "#/definitions/interactive" } 
     }, 
     "description": { 
      "id": "http://jsonschema.net/description", 
      "type": "object", 
      "properties": { 
       "elementId": { "$ref": "#/definitions/elementId" }, 
       "elementType": { "$ref": "#/definitions/elementType" }, 
       "content": { "$ref": "#/definitions/content" } 
      }, 
      "required": ["elementId", "elementType", "content"] 
     }, 
     "descriptions": { 
      "items": { "$ref": "#/definitions/description" } 
     }, 
     "children": { 
      "items": { 
       "anyOf": [ 
        { "$ref": "#/definitions/group" }, 
        { "$ref": "#/definitions/question" } 
       ] 
      }, 
      "minItems": 1 
     }, 
     "question": { 
      "type": "object", 
      "properties": { 
       "elementId": { "$ref": "#/definitions/elementId" }, 
       "descriptions": { "$ref": "#/definitions/descriptions" }, 
       "interactives": { "$ref": "#/definitions/interactives" } 
      }, 
      "required": ["elementId", "descriptions", "interactives"] 
     }, 
     "group": { 
      "type": "object", 
      "properties": { 
       "elementId": { "$ref": "#/definitions/elementId" }, 
       "descriptions": { "$ref": "#/definitions/descriptions" }, 
       "children": { "$ref": "#/definitions/children"} 
      }, 
      "required": ["elementId", "descriptions", "children"] 
     } 
    }, 
    "type": "object", 
    "properties": { 
     "elementId": { "$ref": "#/definitions/elementId" }, 
     "description": { "$ref": "#/definitions/descriptions" }, 
     "children": { "$ref": "#/definitions/children" } 
    }, 
    "required": [ 
     "elementId", 
     "descriptions", 
     "children" 
    ] 
} 

,我發現了以下錯誤:

Error when resolving schema reference '#/definitions/elementId'. Path 'definitions.description.properties.elementId', line 135, position 30. 

我想不通解決問題是什麼。我多次掃描文檔並查看了教程,但我沒有任何線索。

回答

1

id關鍵字的語義有點混亂。我不確定自己完全理解它。一般來說,將id包括在您的模式的根目錄以外的地方几乎不是一個好主意。

The "id" keyword (or "id", for short) is used to alter the resolution scope. When an id is encountered, an implementation MUST resolve this id against the most immediate parent scope. The resolved URI will be the new resolution scope for this subschema and all its children, until another id is encountered.

考慮以下摘自你的模式。由於您包含關鍵字id,因此您的「elementId」和「label」$ref不像您期望的那樣根據文檔根目錄解析,而是從最近的父模式id解析。

"option": { 
    "id": "http://jsonschema.net/option", 
    "type": "object", 
    "properties": { 
     "elementId": { "$ref": "#/definitions/elementId" }, 
     "label": { "$ref": "#/definitions/label" } 
    }, 
    "required": ["elementId", "label"], 
    "definitions": { ... } <-- your $refs expect values here 
    } 
}, 

我已經看到,在某些圈子裏,人們寫有id S代表每個子模式模式。我不確定他們認爲他們從中獲得什麼好處,但我懷疑他們認爲id僅僅是一個標籤,並不瞭解它如何改變解析範圍。

如果您確實有充分的理由在任何地方使用id並希望將其留在,您可以在發生衝突時明確引用根id

{ "$ref": "http://some.site.somewhere/entry-schema#definitions/elementId" } 
+0

僅供參考,我創建了一個新的答案,而不是編輯原件,因爲它是一個完全不同的答案,而不是更新。 – Jason

+0

非常感謝!現在根據http://www.jsonschemavalidator.net/,JSON-Schema是有效的。 – Ahnde

相關問題