我有两个单独的JSON模式(用于验证REST API的HTTP请求端点),它们都接受相同的确切对象,但具有不同的必填字段(这是创建与更新请求)。有没有办法可以重用此对象的单个定义并仅更改必填字段?我知道如何使用$ref
将对象重用为另一个对象的属性,但我无法弄清楚如何将整个对象重用为模式中的顶级对象。到目前为止我失败的尝试:
event.json
{
"id": "event",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"start_date": {
"type": "integer"
},
"end_date": {
"type": "integer"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
事件create.json
{
"id": "event-create",
"type": "object",
"$ref": "event",
"additionalProperties": false,
"required": [ "name", "description" ]
}
显然这不起作用。似乎它试图将“事件”的全部内容插入到“event-create”的定义中,包括ID等。我试过推荐event#/properties
无济于事。我似乎无法将$ref
作为属性属性中的唯一值。有什么想法吗?
答案 0 :(得分:5)
JSON参考对象中除“$ ref”以外的任何成员都应被忽略。
- http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3
这就是为什么你的例子不起作用的原因。除了$ref
字段之外的任何内容都应该被忽略。
对$ref
的支持仅限于类型为JSON Schema的字段。这就是为什么尝试将它用于properties
不起作用的原因。 properties
是一个普通对象,其值为JSON Schema。
执行此操作的最佳方法是使用allOf
。在这种情况下,allOf
可以被认为是一个mixin模式列表。
{
"id": "event-create",
"type": "object",
"allOf": [{ "$ref": "event" }],
"required": ["name", "description"]
}
答案 1 :(得分:1)
我发现一些似乎有用的语法,但我对它并不十分满意:
{
"id": "event-create",
"allOf": [
{ "$ref": "event" },
{ "required": [ "name", "description" ] }
]
}
似乎滥用了allOf
运算符,特别是对于没有必填字段的另一种情况(因此allof
只有一个元素)。但它确实有效,所以除非有人有更好的想法,否则我会继续使用它。