1

尝试使用http://www.jsonschemavalidator.net/验证以下架构时,

{
    "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.

我无法弄清楚问题是什么。我多次扫描文档并查看教程,但我没有任何线索。

4

1 回答 1

3

关键字的语义id有点混乱。我不确定我自己是否完全理解。一般来说,包含id架构根以外的任何地方几乎都不是一个好主意。

“id”关键字(或简称“id”)用于改变解析范围。当遇到 id 时,实现必须针对最直接的父范围解析此 id。解析的 URI 将成为此子模式及其所有子模式的新解析范围,直到遇到另一个 id。

考虑以下来自您的架构的摘录。因为您包含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任何地方使用 s 并希望保留它们,那么id当您遇到冲突时,您始终可以显式引用根。

{ "$ref": "http://some.site.somewhere/entry-schema#definitions/elementId" }
于 2016-01-25T02:12:22.837 回答