Swashbuckle-将DisplayName添加到模型属性

时间:2019-05-24 07:24:23

标签: swagger customization swashbuckle

我在.NET Core应用程序中使用Swagger / Swashbuckle。 如何在swagger.json输出文件中添加模型属性的显示名称?

这是我的模特:

 public class Role
    {
        [DisplayName("Role Name")]
        public string Name { get; set; }
        public int Level { get; set; }
    }

这里是当前输出

"Role": {
   "properties": {
      "Name": {
         "type": "string"
      },
      "Level": {
         "format": "int32",
         "type": "integer"
      }
   }
}

这里是所需的输出:

"Role": {
   "properties": {
      "Name": {
         "displayName": "Role Name",
         "type": "string"
      },
      "Level": {
         "displayName": "Level",
         "format": "int32",
         "type": "integer"
      }
   }
}

2 个答案:

答案 0 :(得分:1)

就像我在评论中提到的那样,“ displayName”不在规范中

我刚刚将其添加到我的一个文件中,以查看验证期间会发生什么:
https://validator.swagger.io/validator/debug?url=https://raw.githubusercontent.com/heldersepu/hs-scripts/master/swagger/56287697_swagger_aws.json

我们可以看到验证器不喜欢这样,我们得到一个错误:

{
  "schemaValidationMessages": [ {
    "level": "error",
    "domain": "validation",
    "keyword": "additionalProperties",
    "message": "object instance has properties which are not allowed by the schema: [\"displayName\"]",
    "schema": {
      "loadingURI": "http://swagger.io/v2/schema.json#", "pointer": "/definitions/schema"
    }
    ,
    "instance": {
      "pointer": "/definitions/MyData/properties/name"
    }
  }
  ]
}

您可以提出对规范的更改,但不要期望很快就会被添加:
https://github.com/OAI/OpenAPI-Specification/issues


我看到的唯一快速的选择或解决方法是使用扩展名:
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#specification-extensions
您可以使用IDocumentFilter注入它们:
https://github.com/domaindrivendev/Swashbuckle.AspNetCore/search?q=IDocumentFilter

看起来IDocumentFilter在最新版本上有一些重大更改:

您所需的输出将有所变化:

"Role": {
   "properties": {
      "Name": {
         "x-displayName": "Role Name",
         "type": "string"
      },
      "Level": {
         "x-displayName": "Level",
         "format": "int32",
         "type": "integer"
      }
   }
}

答案 1 :(得分:1)

您可以使用现成的 DisplayName() attribute 代替使用 JsonPropertyName() attribute

public class Role
    {
        [JsonPropertyName("Role Name")]
        public string Name { get; set; }
        public int Level { get; set; }
    }