我想正确地呈现一个hashmap(key:一个UUID,* 值 *:在我的API文档的Response schema
和Response samples
(examples)部分都有一个对象),例如:
{
"objects": {
"3a34655e-9566-4d5e-bce7-8fa71670993b": {
"title": "Foo"
},
"4bb806a9-fcd1-4a32-b2f0-6cbb45cfc894": {
"title": "Bar"
}
}
}
我正在使用这些库进行Symfony 6项目,这些库应该与OpenAPI 3.0和3.1规范兼容:
zircote/swagger-php
(版本:4.7.10
)nelmio/api-doc-bundle
(版本:v4.11.1
)
阅读this related StackOverflow answer,我考虑了两个选择:
选项1 -附加属性
/**
* @var array<string, ObjectDto>
*
* @OA\Property(
* type="object",
* @OA\AdditionalProperties(
* type="object",
* ref=@Model(type=ObjectDto::class),
* ),
* description="The objects indexed by ID"
* )
*/
问题
我没有找到任何方法来覆盖Response schema
部分中呈现的默认分配给hashmap键的property name*
,也没有找到Response samples
部分中呈现的"property1"
和"property2"
:
"objects": {
"property1": { ... },
"property2": { ... }
},
我可以自定义密钥的信息
选项2 -模式属性
/**
* @var array<string, ObjectDto>
*
* @OA\Property(
* type="object",
* patternProperties={
* "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"=@OA\Property(
* type="object",
* ref=@Model(type=ObjectDto::class),
* )
* },
* description="The objects indexed by ID"
* )
*/
问题
Response schema
部分是可以的,但是在Response samples
部分中生成的示例是空,我得到:
"objects": { }
问题
我错过了什么吗?使用OpenAPI Specification 3.1是否可以完全控制散列表的呈现?
1条答案
按热度按时间sg3maiej1#
**OpenAPI 3.0似乎不支持使用,甚至不支持模仿patternProperties的效果。**你会在他们的一些提案中看到它,但截至2023年9月,它还没有实现。您需要将Map的对象转换为描述键值对的数组,可以是对象数组,也可以是元组。或者你可以站在我的立场上,无法从后端更改数据的表示,只能默默地为类型安全的丧失而哭泣。
我花了很长时间才弄明白,答案在this page上。OpenAPI使用jsonSchema的修改版本来描述对象,它支持额外的键,并放弃对其他键的支持,包括我们的belov'd patternProperties。
不支持的[jsonSchema]关键字:
*patternProperties<-
他们提供了following page,它提供了关于处理字典、散列Map等的信息--尽管我找不到关于特定键处理模式的信息。