我正在为RESTful网络服务充实模式,我对一件小事感到有点难过。想象一下,如果我有以下架构:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": ["name"],
"properties": {
"name": {
"type": "string"
},
"urn": {
"type": "string"
}
}
}
由于URN是由我的服务生成的,因此我不想在客户请求中接受它。因此urn
数组中不包含required
。但是,它在响应中是必需的,因此我无法使用此架构来验证我的服务提供的响应。我不想使用两种不同的模式,而是必须保持同步。
有没有办法使用单一模式来严格模拟这两种情况?或者,如果我需要使用两个模式,有没有办法引用一个公共结构模式,只是覆盖我的请求和响应模式中的required
字段?
答案 0 :(得分:2)
这是一个已知问题,没有好办法处理它。
将其保留在一个模式中的唯一方法是不在required
数组中包含服务器生成的属性,并在服务器端执行其他检查以验证这些属性。
不,无法覆盖架构关键字。 JSON Schema关键字始终为集合添加约束。您需要从公共模式开始,并使用allOf
从那里扩展。
以下是您需要做的事情的一个例子。
创作架构:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/create-my-schema",
"type": "object",
"required": ["name"]
"properties": {
"name": {
"type": "string"
}
}
}
完整架构:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/my-schema",
"allOf": [{ "$ref": "http://example.com/create-my-schema" }],
"required": ["urn"],
"properties": {
"urn": {
"type": "string"
}
}
}
如果你不关心模式的人类可读性,这种方法很好。否则,有些人选择在服务器端动态构建模式,因此生成的模式可能有重复,但代码没有。
答案 1 :(得分:0)
您可以使用动态架构,使用" oneOf "
{
"type" : "object",
"required" : ["name"],
"properties" : {
"name" : {
"oneOf" : [{
"$ref" : "#/definitions/withURN"
}, {
"$ref" : "#/definitions/withoutURN"
}
]
}
},
"definitions" : {
"withURN" : {
"properties" : {
"name" : {
"type" : "string"
},
"urn" : {
"type" : "string"
}
}
},
"withoutURN" : {
"properties" : {
"name" : {
"type" : "string"
}
}
}
}
}