我一直在研究json架构,以验证我的某个Web服务的答案。
答案分为两个属性:data
和status
。如果status.code
设置为0,则data
必须遵守特定架构。否则,如果status.code
设置为-1,则不会读取data
,因此我不想检查它是否遵循架构。
这是架构:
{
"$schema": "http://json-schema.org/schema#",
"id": "file://registration.json",
"type": "object",
"properties": {
"status": {
"$ref": "#/definitions/classes/status"
}
},
"anyOf": [
{
"$ref": "#/definitions/conditions/status-is-ok"
},
{
"$ref": "#/definitions/conditions/status-is-nok"
}
],
"definitions": {
"classes": {
"status": {
"type": "object",
"properties": {
"code": {
"type": "integer"
},
"message": {
"type": "string"
}
},
"required": [
"code",
"message"
]
},
"data": {
"type": "object",
"properties": {
"propertyA": {
"type": "#/definitions/classes/metadatauser"
},
"propertyB": {
"type": "#/definitions/classes/membreinfo"
}
},
"required": ["propertyA", "propertyB"]
}
},
"conditions": {
"status-is-ok": {
"status": {
"properties": {
"code": 0
}
},
"data": {
"$ref": "#/definitions/classes/data"
}
},
"status-is-nok": {
"status": {
"properties": {
"code": -1
}
},
"data": {
"type": "object"
}
}
}
}
}
这是一个不应该验证的例子:
{
"data": {},
"status": {
"code": 0,
"message": "OK"
}
}
目前,这部分代码通过了,我不知道为什么。
答案 0 :(得分:0)
你在这里遇到了一些问题,所以我会尝试解释所有这些问题。你走在正确的轨道上了!
"properties": {
"code": 0
}
“属性”的值必须是一个对象。此对象的每个值 必须是有效的JSON模式。
http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.5.4
您不能将期望的值作为属性键的值。
但是,您可以使用[const][1]
关键字来实现特定的值验证。
"$ref": "#/definitions/conditions/status-is-ok"
...
"conditions": {
"status-is-ok": {
"status": {
"properties": {
[
definitions
]关键字的值必须是一个对象。每个成员的价值 对象必须是有效的JSON模式。
https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-9
这意味着您需要将定义中每个键的每个值视为JSON模式。如果您有一个JSON模式,而您没有在properties
对象中嵌套“status”,则不会进行验证。 “数据”也是如此。
(严格地说,根据规范的定义部分,你不能在模式对象中深深地嵌套模式,但这似乎得到了一些实现的支持,并使用正确的解析规则解析。前缀可能更好。 )
完整的固定架构如下。
{
"$schema": "http://json-schema.org/schema#",
"id": "file://registration.json",
"type": "object",
"properties": {
"status": {
"$ref": "#/definitions/classes/status"
}
},
"anyOf": [
{
"$ref": "#/definitions/conditions/status-is-ok"
},
{
"$ref": "#/definitions/conditions/status-is-nok"
}
],
"definitions": {
"classes": {
"status": {
"type": "object",
"properties": {
"code": {
"type": "integer"
},
"message": {
"type": "string"
}
},
"required": [
"code",
"message"
]
},
"data": {
"type": "object",
"properties": {
},
"required": [
"propertyA",
"propertyB"
]
}
},
"conditions": {
"status-is-ok": {
"properties": {
"status": {
"properties": {
"code": {
"const": 0
}
}
},
"data": {
"$ref": "#/definitions/classes/data"
},
},
"additionalProperties": false
},
"status-is-nok": {
"properties": {
"status": {
"properties": {
"code": {
"const": -1
}
}
},
"data": {
"type": "object"
},
},
"additionalProperties": false
}
}
}
}
如果其中任何一项没有意义,请告诉我。 如果您想进一步讨论任何方面,请随意加入JSON Schema slack服务器!很高兴也在这里发表评论。