【发布时间】:2017-11-15 18:35:24
【问题描述】:
我有以下示例架构:
{
"id": "http://schema.acme.com/widgets",
"$schema": "http://json-schema.org/draft-06/schema#",
"definitions": {
"bentWidget": {
"type": "object",
"required": ["angle", "baseWidget"],
"properties": {
"angle": {
"type": "number",
"minimum": 0,
"maximum": 90
},
"baseWidget": {
"$ref": "#/definitions/baseWidget"
}
}
},
"highPowerWidget": {
"type": "object",
"required": ["power", "baseWidget"],
"properties": {
"power": {
"type": "number",
"minimum": 101,
"maximum": 200
},
"baseWidget": {
"$ref": "#/definitions/baseWidget"
}
}
},
"color": {
"description": "the color of a widget",
"type": "string"
},
"baseWidget": {
"description": "The base type for a widget",
"type": "object",
"required": [
"title",
"version",
"colors"
],
"properties": {
"title": {
"type": "string",
"maximum": 100,
"minimum": 1,
"pattern": "^[a-zA-Z]+((_[a-zA-Z]+)*|([a-zA-Z]+_)*|_)"
},
"flanged": {
"type": "boolean"
},
"version": {
"type": "string",
"maximum": 64,
"minimum": 1
},
"colors": {
"type": "array",
"items": {
"$ref": "#/definitions/color"
}
}
}
}
},
"anyOf": [
{ "$ref": "#/definitions/baseWidget" },
{ "$ref": "#/definitions/bentWidget" },
{ "$ref": "#/definitions/highPowerWidget" }
]
}
我想测试它,所以我把它写到一个文件中:
{
"type": "highPowerWidget",
"title": "foobar",
"version": "foo"
}
然后我在 shell 上运行 ajv
$ ajv -s widgetSchema.json -d widget-highPower.json
widget-highPower.json valid
它告诉我它是有效的,这是不正确的,highPowerWidget 必须具有 power 属性,以及“继承”的 version 和 colors 属性。
我可以通过删除 anyOf 部分并输入如下内容来测试我的个人架构:
"properties": {
"testObject": {
"type": "object",
"oneOf": [
{ "$ref": "#/definitions/baseWidget" },
{ "$ref": "#/definitions/bentWidget" },
{ "$ref": "#/definitions/highPowerWidget" }
]
}
},
"required": [ "testObject" ]
并验证此 JSON:
{
"testObject": {
"type" : "highPowerWidget",
"title" : "title",
"version" : "baz",
"colors" : [ "red", "green", "blue"],
"flanged" : true
}
}
但这似乎是错误的,原因有两个。
- 我不应该有一个“testObject”属性
- oneOf 仅在我列出单行时才有效,使用多行验证任何内容。
我认为我对如何编写或至少测试我的架构有一个基本的误解。我的目标是拥有一组全部验证的对象,以及一组全部失败的文件。这样我就可以对我的架构进行单元测试。
【问题讨论】:
-
power 不是 highPowerWidget 的必需属性,因此可以省略
-
不错,但事实并非如此。 (我从我的实际工作中创建了“小部件”模式来保护我无法谈论的东西。你是对的,但 highPowerWidget 也应该有颜色,但它没有。另外,当我添加 required 到 highPower 时仍在验证...
-
(添加缺少必填)
-
啊,但我缺少 '"required": ["power", "baseWidget"],' -- 这看起来很有希望......
-
无效..
标签: jsonschema