json架构属性描述和" $ ref"使用

时间:2015-11-06 10:49:13

标签: json jsonschema json-schema-validator

我正在编写一个json模式来验证由exe生成的json输出。模式有点复杂,我定义了一些"定义"在属性中引用(" $ ref":"#/ definitions / ...)。在这里使用定义更为重要,因为我有一个定义是递归的情况。

我的架构现在运行良好,它可以正确验证我的json输出。

现在,我正在尝试使用" description"正确地记录架构。每个属性的关键字。为了开发模式,我使用了一个以图形方式表示模式的编辑器(XMLSpy)。这是非常有用的,但我面对一个奇怪的行为,我不知道它是否是编辑器中的问题,或者我是否真的不理解。

以下是解释我的问题的json架构的最小示例:



{
	"$schema": "http://json-schema.org/draft-04/schema#",
	"type": "object",
	"properties": {
		"sourcePath": {
			"$ref": "#/definitions/Path",
			"description": "Here the description where I expected to set it"
		},
		"targetPath": {
			"$ref": "#/definitions/Path",
			"description": "Here another description where I expected to set it to that property of the same kind but whith a different use."
		}
	},
	"additionalProperties": false,
	"definitions": {
		"Path": {
			"description": "Here the descriptiond where it is set by the software",
			"type": "object",
			"properties": {
				"aUsefulProperty": {
					"type": "string"
				},
				"parentPath": {
					"$ref": "#/definitions/Path",
					"description": "Here yest another description where I expected to set it.."
				}
			},
			"required": [
				"aUsefulProperty"
			],
			"additionalProperties": false
		}
	}
}




当我尝试向属性添加描述时,编辑器实际上在对象的定义中添加了描述。因此,编辑器会显示这两个属性的描述" sourcePath"和" targetPath"此外,它还在" parentPath"中显示此描述。

我的意图是为每个属性分别有三个不同的描述(也可能是定义本身,但这不是问题)。如果我手动将它们添加到json架构,没有问题,但这些描述不会出现在图形编辑器中。

所以,我很困惑。

您认为我的图形编辑器存在问题,还是我错了?

基本上,当我们使用" $ ref"要定义属性,是否可以添加其他字段作为描述或使用" $ ref"暗示不使用别的东西?在这种情况下,我如何正确记录财产?

我必须向一些合作伙伴提供我的json模式,这些模式必须使用它们作为文档来生成正确的json输出。所以,我想尽可能地向他们提供一个自我记录的json模式,就像我们可以用XML做的那样。

由于

2 个答案:

答案 0 :(得分:7)

  

" $ ref"以外的任何成员在JSON参考对象中应该是      忽略。

     

要设置description,您必须执行类似以下示例的操作。它可能会在你的编辑器中引起其他的怪异,但我很确定这是最干净的方法。

原件:

{
    "$ref": "#/definitions/Path",
    "description": "Here the description where I expected to set it"
}

建议更正:

{
    "allOf": [{ "$ref": "#/definitions/Path" }],
    "description": "Here the description where I expected to set it"
}

答案 1 :(得分:1)

在当前JSON模式草稿下允许覆盖$ref中的关键字。原始问题中的模式将被视为有效(取决于草稿...)

来自原始帖子

    ...
    "properties": {
        "sourcePath": {
            "$ref": "#/definitions/Path",
            "description": "Here the description where I expected to set it"
        },
        "targetPath": {
            "$ref": "#/definitions/Path",
            "description": "Here another description where I expected to set it to that property of the same kind but whith a different use."
        }
    },
   ...

JSON模式规范包含一个identical example

来自JSON Schema Draft2019

            ....
            "properties": {
                "enabled": {
                    "description": "If set to null, Feature B
                                    inherits the enabled
                                    value from Feature A",
                    "$ref": "#/$defs/enabledToggle"
                }
            }
            ...

问题中的用例正是JSON Schema规范所描述的。实际上,您可以覆盖任何注释关键字(即titledescriptiondefaultexamples)。上面链接的示例还显示了覆盖“默认”属性。

不幸的是,该标准使该实现成为可选。

  

应用程序可以决定使用多个注释值中的哪个   基于贡献值的架构位置。这旨在   允许灵活使用。

所以您应该在依赖它之前对其进行测试。