Swagger:添加描述和参考

0dxa2lsx  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(238)

我想给一个对象属性添加一个描述,它的定义被引用了。类似于:

newCreditCard:
        type: object
        properties:
          billingPhone:
            description: Phone number of the card holder
            $ref: "#/definitions/PhoneNumber"

但编辑器警告将跳过description属性:

Extra JSON Reference properties will be ignored: description

我发现了一个不太优雅的变通方案,适用于编辑器,但不适用于Swagger UI(不确定这可能是由于最近更新到3. 0. 2版本的Swagger UI)

newCreditCard:
        type: object
        properties:
          billingPhone:
            description: Phone number of the card holder
            allOf:
            - $ref: "#/definitions/PhoneNumber"

在您的Swaggers规范中如何做到这一点?
谢谢你的帮助!

s4chpxco

s4chpxco1#

如果您将任何内容添加到$ref的同一级别,它将被忽略。
json $引用https://datatracker.ietf.org/doc/html/draft-pbryan-zyp-json-ref-03#section-3
正确的方法是在被引用对象中提供描述。

oxcyiej7

oxcyiej72#

您可以简单地将description属性移到PhoneNumber的定义中。您的原始帖子没有显示您是如何定义PhoneNumber的,但是下面的代码片段验证了此代码,没有警告:

definitions:
  phoneNumber:
    type: string
    description: Phone number of the card holder

  newCreditCard:
    type: object
    properties:
      billingPhone:
        $ref: "#/definitions/phoneNumber"

如果这个答案不是你想要的,请重新回答问题。我们需要知道你想要达到什么目的。

a7qyws3x

a7qyws3x3#

虽然它不符合JSON标准。如果您使用Swashbuckle生成swagger,我利用schema的“Extensions”属性,并设法创建了一个swagger JSON,它具有$ref和扩展属性。

var refSchema = new OpenApiSchema
{      
     //Reference = new OpenApiReference { ExternalResource = referenceLink, Type = ReferenceType.Link }, this wont work and omit all your other properties
    Extensions = new Dictionary<string, IOpenApiExtension>
    {
        { "$ref" , new OpenApiString(referenceLink) } // adding ref as extension cause according to JSON standards $ref shouldnt have any other properties
    },
    Description = prop.Value.Description,
    ReadOnly = prop.Value.ReadOnly,
    Required = prop.Value.Required,
    Type = prop.Value.Type,
    Example = prop.Value.Example,
};
ccgok5k5

ccgok5k54#

对于将Swashbuckle与ASP.NET一起使用的任何人,您可以使用以下代码将$ref构造置于allOf之下(就像:

// do this wherever you are calling AddSwaggerGen()
ArgBuilder.Services.AddSwaggerGen(opts => {
  opts.UseAllOfToExtendReferenceSchemas(); // add this line.
});

现在,如果您有一个模型,其中有两个相同类型的属性,则每个字段的单独描述将显示在Swagger UI中(例如,下面的FooHeaderBarHeader都是HttpHeader类型的属性,它们的描述将显示):

相关问题