JSON Pointer inside JSON 文件:如何用YAML表达?
JSON Pointer inside JSON document: how to express in YAML?
我正在定义要实施的 REST 服务的 Swagger 规范。由于响应文档表示一个树状结构,其中几个节点重复多次,我想在文档的开头定义它们,然后通过 JSON 指针表示法引用它们。
因此响应文档应如下所示:
{
"definitions": {
"organizations": [
{ "id": 101, "name": "Org 1" },
...
],
"clusters": [
{ "id": 201, "name": "Cluster 1" },
...
],
"plants": [
{ "id": 301 }
]
},
"plants_hierarchy": {
"relations": [
{
"cluster": { "$ref", "#/definitions/clusters/1" },
"organization": { "$ref", "#/definitions/organizations/123" },
"plants": [
{ "$ref": "#/definitions/plants/234" },
...
]
},
...
]
}
}
#/plants_hierarchy/relations/plants 中的植物对象应表示为 JSON 指针而不是原始对象,以保持文档较小。
我的问题是如何在Swagger YAML文档中表达JSON指针?
YAML 提供 anchors and aliases,它完全涵盖了您的 use-case:
definitions:
organizations:
- &my_organization
id: 101
name: Org 1
clusters:
- &my_cluster
id: 201
name: Cluster 1
plants:
- &my_plant
id: 301
plants_hierarchy:
relations:
- cluster: *my_cluster
organization: *my_organization
plants:
- *my_plant
首先,你为什么不直接包含内联数据?在实际 API 响应中使用 JSON References/JSON 指针是一种相当不常见的情况,它需要您的 API 客户端使用 JSON 参考解析库来计算那些参考资料。大多数 languages/frameworks 有 JSON 库,但 JSON 参考解析库很少见。如果所有数据都是内联的,那么访问它就很简单了——例如只需使用 response.plants_hierarchy.relations[0].cluster.name
。但是将数据隐藏在 JSON 引用之后会使客户的事情变得更加复杂。
无论如何,如果你确定这是你想要做的,那么 $ref
属性 可以定义一个简单的 string
属性,可能带有pattern
.
swagger: '2.0'
...
definitions:
JsonReference:
type: object
properties:
'$ref':
type: string
pattern: '^#'
example: '#/definitions/something/1'
Relation:
type: object
properties:
cluster:
$ref: '#/definitions/JsonReference'
organization:
$ref: '#/definitions/JsonReference'
plants:
type: array
items:
$ref: '#/definitions/JsonReference'
我正在定义要实施的 REST 服务的 Swagger 规范。由于响应文档表示一个树状结构,其中几个节点重复多次,我想在文档的开头定义它们,然后通过 JSON 指针表示法引用它们。
因此响应文档应如下所示:
{
"definitions": {
"organizations": [
{ "id": 101, "name": "Org 1" },
...
],
"clusters": [
{ "id": 201, "name": "Cluster 1" },
...
],
"plants": [
{ "id": 301 }
]
},
"plants_hierarchy": {
"relations": [
{
"cluster": { "$ref", "#/definitions/clusters/1" },
"organization": { "$ref", "#/definitions/organizations/123" },
"plants": [
{ "$ref": "#/definitions/plants/234" },
...
]
},
...
]
}
}
#/plants_hierarchy/relations/plants 中的植物对象应表示为 JSON 指针而不是原始对象,以保持文档较小。
我的问题是如何在Swagger YAML文档中表达JSON指针?
YAML 提供 anchors and aliases,它完全涵盖了您的 use-case:
definitions:
organizations:
- &my_organization
id: 101
name: Org 1
clusters:
- &my_cluster
id: 201
name: Cluster 1
plants:
- &my_plant
id: 301
plants_hierarchy:
relations:
- cluster: *my_cluster
organization: *my_organization
plants:
- *my_plant
首先,你为什么不直接包含内联数据?在实际 API 响应中使用 JSON References/JSON 指针是一种相当不常见的情况,它需要您的 API 客户端使用 JSON 参考解析库来计算那些参考资料。大多数 languages/frameworks 有 JSON 库,但 JSON 参考解析库很少见。如果所有数据都是内联的,那么访问它就很简单了——例如只需使用 response.plants_hierarchy.relations[0].cluster.name
。但是将数据隐藏在 JSON 引用之后会使客户的事情变得更加复杂。
无论如何,如果你确定这是你想要做的,那么 $ref
属性 可以定义一个简单的 string
属性,可能带有pattern
.
swagger: '2.0'
...
definitions:
JsonReference:
type: object
properties:
'$ref':
type: string
pattern: '^#'
example: '#/definitions/something/1'
Relation:
type: object
properties:
cluster:
$ref: '#/definitions/JsonReference'
organization:
$ref: '#/definitions/JsonReference'
plants:
type: array
items:
$ref: '#/definitions/JsonReference'