我可以在第三个模式中组合两个 JSON 模式吗?

Can I compose two JSON Schemas in a third one?

我想描述 JSON 我的 API 将 return 使用 JSON 架构,引用我的 OpenAPI 配置文件中的架构。

我需要为每个 API 方法设置不同的架构。假设我支持 GET /peopleGET /people/{id}。我知道如何定义一个“人”的模式一次,并使用 $ref.

/people/people/{id} 中引用它

[编辑:在 post]

的末尾看到一个(希望如此)更清晰的例子

我不明白的是如何定义和重用我的响应的结构,即:

{
   "success": true,
   "result" : [results]
}

or

{
   "success": false,
   "message": [string]
}

使用 anyOf(既用于 success/error 格式检查,也用于结果,引用各种模式(people-multi.jsonpeople-single.json),我可以定义一个“根模式”api-response.json,我可以检查 JSON 响应的一般有效性,但它不允许我检查 /people 调用 return 是一个数组例如,一群人,而不是一个人。

我如何定义一个 api-method-people.json 来包含响应的一般结构(当然来自外部模式,以保持其干燥)并在 result 中注入另一个模式?

编辑:一个更具体的例子(希望以更清晰的方式呈现)

我有两个 JSON 模式描述了我的两个 API 方法的响应格式:method-1.jsonmethod-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.jsonmethod-2.json,而不是为每个方法定义成功和结果属性。

简而言之,我想我想要某种组合或继承,而不是包含($ref 允许)。

所以 JSON 架构不允许这种组合,至少以简单的方式或在 2019-09 草案之前是这样(感谢@Relequestual!)。

但是,我设法让它在我的案例中起作用。我首先在两个基本模式 api-result.jsonapi-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 方法的结果的具体形式。