当前位置: 首页 > 知识库问答 >
问题:

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

司徒鸿文
2023-03-14

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

Mongoose支持混合的数据类型,这基本上是一个可以包含任何内容的非结构化对象。但是,根据Swagger规范,属性的类型的唯一可能值是stringintegernumberboolean数组。我在留档、Google或GitHub上Swagger-Spec项目的开放问题中找不到任何允许混合数据类型的内容。

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

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

例子

猫鼬模式定义:

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个答案

苏鸿卓
2023-03-14

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

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

斯威格明确表示不支持这种建模。有几个原因,但他们集中在决定论和语言支持。虽然动态语言可以更容易地支持非确定性API,弱类型语言可以很容易地支持动态类型,但其他语言将因此受到影响。API旨在实现互操作性,与语言无关,因此您必须考虑这些限制。

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

Swagger 2.0在定义模型方面增加了更多的灵活性,甚至允许自由形式的对象(和do note-Object,而不是primitives)。虽然一般情况下不建议使用它,但有些用例是无法避免的,但即使是强类型语言也可以处理它(我可以详细介绍用例,但它与手头的问题无关)。

作为添加的信息-从文档的角度考虑,我将使用您的地址字段作为示例。你在这里说的是,在API方面,地址字段是一个通配符。你可以接受它的任何内容,它不必是地址,不必有结构,不必有特定的信息。如果有人愿意,他们可以使用该字段存储核发射代码。现在,如果这是您的意图,那么只需将字段标记为字符串值,如果有人想将序列化的JSON对象作为字符串发送,那么它也很合适。

 类似资料:
  • 在下面的mysql查询中,我使用了一个自定义的语句顺序,这样我就可以以特定的顺序而不是字母顺序显示各种大小: 如果某些产品也有数字大小,我如何编写订单,以便将数字大小与自定义订单一起按升序排列? 所需输出的示例: 30,32,34,S,M,L 或 S、 M,L,30,32,34

  • 我有一个处理器,它从主题中获取json字符串,类型为GenericRecord。现在我把这条河分成两条支流。我采用第一个分支,并将(key,value)映射为2个字符串,其中包含一个特定的json字段和该字段的值,然后按key分组。到目前为止,一切都很好。现在,我必须用用户定义的新类型聚合流,并收到一个异常。 这里是代码: 新类型: 好流: 问题是: 这是例外: 我如何解决这个问题? 更新 ---

  • 我试图弄清楚如何让Swagger解析一个带有未定义数量的值的关联数组。 我有类似的案例,不同的是这些其他案例是完全规则的(我事先知道所有属性的名称)。然而,在这种情况下,我可能不知道(实际上我不想知道)哪些可能是值的名称。 JSON的一个例子,它有一个带有未定义数量的语言代码的关联数组。每个语言代码键都有一组未定义的翻译,每个翻译都有一个键和值。在这种情况下,“描述”和“步行访问”是翻译的关键。但

  • 是否可以为基元类型定义招摇定义/模型?例如,考虑以下几点 但是,上面的示例返回了许多错误(例如,swagger需要一个字段)并且没有示例使用任何不是。 目的是将其用作另一个模型的子组件和参数——以某种方式重用已经定义的组件。 把这想象成一个昂首阔步的typedef 编辑:根据规范,定义对象与模式对象相同http://swagger.io/specification/#schemaObject,表示

  • 我正在使用Protege在OWL中添加一些新的数据类型。 数据类型类似于Percentral,我想指定它的范围,双倍值从0到100不等。 类似地,一个名为Quality的数据类型,我想用从0到1的double值指定它的范围。 我试图找出,但我发现两个链接,但不是有用的我的上下文。 > 如何为OWL DataProperties定义我自己的范围如果我们手动创建OWL文件而不使用Protege这很有用

  • 我们有一个DynamoDb表,其中一个列名“createdAt”有时创建为S(String)数据类型,有时创建为N(Number)数据类型。 在我的代码中,如果我定义为String,当我想获取数据时它会失败,它是数字: 如果我定义为Number,当我想获取数据并且它是表中的字符串时失败: 你们有没有人以前也有过同样的问题?应该有办法解决它对吗?并且不能只选择一种数据类型:(