首页 文章

在Swagger中定义具有混合数据类型的属性

提问于
浏览
6

我已经有一个工作的swagger文档使用Swagger-UI项目生成文档,但我遇到了一个小问题 .

Mongoose支持 Mixed 的数据类型,它基本上是一个可以包含任何内容的非结构化对象 . 但是,根据Swagger规范,属性 type 的唯一可能值是 stringintegernumberbooleanarray . 我一直无法在文档,谷歌或GitHub上的Swagger-Spec项目的公开问题中找到任何可以允许混合数据类型的内容 .

在Swagger-Spec文档中,它们定义了 type 选项,它们引用了JSON-Schema项目 . 根据JSON-Schema规范 object 应该是一个选项,但它没有被列为Swagger-Spec中的潜在值 .

有没有人知道在Swagger文档中指明模型的属性可以包含任何值(单个原始值或对象)的方法?

Examples

Mongoose架构定义:

var sampleSchema = new mongoose.Schema({
    lookupCodes : { type: [mongoose.Schema.Types.Mixed] },
    address: { type: mongoose.Schema.Types.Mixed }
});

mongoose.model('Sample', sampleSchema);

猫鼬模型的用法:

var Sample = mongoose.model('Sample');
var doc = new Sample();

这些都是两个已定义属性的有效值:

doc.lookupCodes = ['A', 'B', 3, 4, 5, 'F'];

doc.lookupCodes = ['A', { code: '123' }, 5];

doc.address = '123 Main St., San Jose, CA, 95125';

doc.address = { street: '123 Main St.', city: 'San Jose', state: 'CA', postalCode: '95125'}

Swagger 1.2文档(片段):

"models": {
    "Sample": {
        "properties": {
            "lookupCodes": {
                "type": "array",
                "items": {
                    "type": "??????"
                },
                "description": "An array of lookup codes. Codes can be strings, numbers or an object containing the `code` property."
            },
            "address": {
                "type": "??????",
                "description": "An address. This value can be a single string, containing all the elements of the address together, or it can be a structured object with each of the elements as separate properties of the object."
            },

我只是想找到一种方法让开发人员查看文档知道模型中的特定属性可以接受/返回任何值(原始变量或对象) .

1 回答

  • 4

    在您的问题中,您描述了两个不同的用例 .

    第一个是使用具有混合值的数组,第二个是可以具有任何值的特定字段(无论是对象,基元还是可能是数组) .

    Swagger明确不支持这种建模 . 有几个原因,但他们专注于决定论和语言支持 . 虽然动态语言可以更轻松地支持非确定性API,而弱类型语言可以轻松支持动态类型,但其他语言会受到影响 . API旨在实现互操作性,与语言无关,因此您必须考虑这些限制 .

    虽然Swagger是一种文档工具,但其工具生态系统包括需要能够以几乎任何语言生成和使用此类API的解决方案 . 显然,它不能100%覆盖,但它试图避免已知问题 .

    Swagger 2.0在定义模型方面增加了更多的灵活性,甚至允许自由形式的对象(并且做注释 - 对象,而不是基元) . 虽然一般情况下不建议使用它,但有些情况下它是无法避免的,但即使是强类型语言也可以处理它(我可以详细说明用例,但它与问题无关)手) .

    作为补充信息 - 从文档的角度考虑它,我将使用您的 address 字段作为示例 . 你在这里说的,API Wise,是地址字段是通配符 . 你可以接受任何东西,它不必具有结构,不必具有特定信息 . 如果有人想要,他们可以使用该字段存储核启动代码 . 现在,如果这是你的意图,那么只需将字段标记为字符串值,如果有人想要将序列化的JSON对象作为字符串发送,它也适合 .

相关问题