我可以在第三个模式中组合两个 JSON 模式吗?
Can I compose two JSON Schemas in a third one?
我想描述 JSON 我的 API 将 return 使用 JSON 架构,引用我的 OpenAPI 配置文件中的架构。
我需要为每个 API 方法设置不同的架构。假设我支持 GET /people
和 GET /people/{id}
。我知道如何定义一个“人”的模式一次,并使用 $ref
.
在 /people
和 /people/{id}
中引用它
[编辑:在 post]
的末尾看到一个(希望如此)更清晰的例子
我不明白的是如何定义和重用我的响应的结构,即:
{
"success": true,
"result" : [results]
}
or
{
"success": false,
"message": [string]
}
使用 anyOf
(既用于 success/error 格式检查,也用于结果,引用各种模式(people-multi.json
、people-single.json
),我可以定义一个“根模式”api-response.json
,我可以检查 JSON 响应的一般有效性,但它不允许我检查 /people
调用 return 是一个数组例如,一群人,而不是一个人。
我如何定义一个 api-method-people.json
来包含响应的一般结构(当然来自外部模式,以保持其干燥)并在 result
中注入另一个模式?
编辑:一个更具体的例子(希望以更清晰的方式呈现)
我有两个 JSON 模式描述了我的两个 API 方法的响应格式:method-1.json
和 method-2.json
.
我可以这样定义它们(这里不是模式,我太懒了):
method-1.json
:
{
success: (boolean),
result: { id: (integer), name: (string) }
}
method-2.json
:
{
success: (boolean),
result: [ (integer), (integer), ... ]
}
但我不想重复结构(JSON 的第一层),所以我想将其提取到 response-base.json
中,这将以某种方式(?)在两者中引用method-1.json
和 method-2.json
,而不是为每个方法定义成功和结果属性。
简而言之,我想我想要某种组合或继承,而不是包含($ref
允许)。
所以 JSON 架构不允许这种组合,至少以简单的方式或在 2019-09 草案之前是这样(感谢@Relequestual!)。
但是,我设法让它在我的案例中起作用。我首先在两个基本模式 api-result.json
和 api-error.json
中分离了两个主要情况(“结果”与“错误”)。 (如果我想 return 一个错误,我只需指向 api-error.json
模式。)
在正确的 API 结果的情况下,我使用 allOf
和 $ref
为给定操作定义了一个模式来扩展基本结果模式,然后重新定义 result
属性:
{
"$schema: "…",
"$id": "…/api-result-get-people.json",
"allOf": [{ "$ref": "api-result.json" }],
"properties": {
"result": {
…
}
}
}
(编辑:我以前只在顶层使用 $ref
,但它似乎不起作用)
这样我就可以指向这个 api-result-get-people.json
,并检查一般结构(success
键值为 true
,以及一个必需的 result
键)以及此“获取人员”API 方法的结果的具体形式。
我想描述 JSON 我的 API 将 return 使用 JSON 架构,引用我的 OpenAPI 配置文件中的架构。
我需要为每个 API 方法设置不同的架构。假设我支持 GET /people
和 GET /people/{id}
。我知道如何定义一个“人”的模式一次,并使用 $ref
.
/people
和 /people/{id}
中引用它
[编辑:在 post]
的末尾看到一个(希望如此)更清晰的例子我不明白的是如何定义和重用我的响应的结构,即:
{
"success": true,
"result" : [results]
}
or
{
"success": false,
"message": [string]
}
使用 anyOf
(既用于 success/error 格式检查,也用于结果,引用各种模式(people-multi.json
、people-single.json
),我可以定义一个“根模式”api-response.json
,我可以检查 JSON 响应的一般有效性,但它不允许我检查 /people
调用 return 是一个数组例如,一群人,而不是一个人。
我如何定义一个 api-method-people.json
来包含响应的一般结构(当然来自外部模式,以保持其干燥)并在 result
中注入另一个模式?
编辑:一个更具体的例子(希望以更清晰的方式呈现)
我有两个 JSON 模式描述了我的两个 API 方法的响应格式:method-1.json
和 method-2.json
.
我可以这样定义它们(这里不是模式,我太懒了):
method-1.json
:
{
success: (boolean),
result: { id: (integer), name: (string) }
}
method-2.json
:
{
success: (boolean),
result: [ (integer), (integer), ... ]
}
但我不想重复结构(JSON 的第一层),所以我想将其提取到 response-base.json
中,这将以某种方式(?)在两者中引用method-1.json
和 method-2.json
,而不是为每个方法定义成功和结果属性。
简而言之,我想我想要某种组合或继承,而不是包含($ref
允许)。
所以 JSON 架构不允许这种组合,至少以简单的方式或在 2019-09 草案之前是这样(感谢@Relequestual!)。
但是,我设法让它在我的案例中起作用。我首先在两个基本模式 api-result.json
和 api-error.json
中分离了两个主要情况(“结果”与“错误”)。 (如果我想 return 一个错误,我只需指向 api-error.json
模式。)
在正确的 API 结果的情况下,我使用 allOf
和 $ref
为给定操作定义了一个模式来扩展基本结果模式,然后重新定义 result
属性:
{
"$schema: "…",
"$id": "…/api-result-get-people.json",
"allOf": [{ "$ref": "api-result.json" }],
"properties": {
"result": {
…
}
}
}
(编辑:我以前只在顶层使用 $ref
,但它似乎不起作用)
这样我就可以指向这个 api-result-get-people.json
,并检查一般结构(success
键值为 true
,以及一个必需的 result
键)以及此“获取人员”API 方法的结果的具体形式。