如何让Swashbuckle生成带有日期(没有时间)的Swagger属性?

时间:2018-05-13 21:01:48

标签: asp.net date swagger datetime-format swashbuckle

我有一个通过Swashbuckle暴露的类,看起来像这样:

public class Person
{
     [JsonProperty("dateOfBirth")]
     [JsonConverter(typeof(DateFormatConverter))]
     public System.DateTime? DateOfBirth { get; set; }
}

internal class DateFormatConverter : Newtonsoft.Json.Converters.IsoDateTimeConverter
{
    public DateFormatConverter()
    {
        DateTimeFormat = "yyyy-MM-dd";
    }
}

(该课程由NSwag-studio制作)

当我使用app.UseSwagger();与Swashbuckle生成Swagger合约时,结果如下:

"Person": {
    "dateOfBirth": {
      "format": "date-time",
      "type": "string"
    }
  }
}

我想配置Swashbuckle以识别我的DateFormatConverter类并相应地处理格式。

我在options.SchemaFilter<DateFormatSchemaFilter>()课程中尝试Startup,但过滤器没有属性的上下文,所以除非我想要所有 DateTime对象date,这不是一个可行的选择。

1 个答案:

答案 0 :(得分:5)

以下是使用iDocumentFilter将"date-time"更改为"date"的方法:

private class Flip2DateDocumentFilter : IDocumentFilter
{
    private List<string> DateTypes(Type AttribType)
    {
        var list = new List<string>();
        foreach (var p in AttribType.GetProperties())
            if (p.CustomAttributes?.Count() > 0)
                list.Add(p.Name);
        return list;
    }

    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry s, IApiExplorer a)
    {
        var t = typeof(Person);
        if (swaggerDoc.definitions[t.Name] != null)
        {
            var dates = DateTypes(t);
            if (dates.Count() > 0)
                foreach (var p in swaggerDoc.definitions[t.Name].properties)
                    if (dates.Contains(p.Key) && p.Value.format == "date-time")
                        p.Value.format = "date";
        }
    }
}

该代码中的键是var t = typeof(Person);,它是将使用CustomAttributes搜寻日期的类。

当然,这段代码不仅仅是用于复制/粘贴的一个小例子IDocumentFilter


另一个选项是使用NodaTime,然后使用NodaTime.LocalDate到应该只是日期的属性,并在你的swagger配置中使用MapType

c.MapType<NodaTime.LocalDate>(() => new Schema { type = "string", format = "date" });


我有这两个选项在这个例子上工作:
http://swagger-net-test.azurewebsites.net/swagger/ui/index?filter=Date#/Date/Date_Post

背后的代码在github上:
https://github.com/heldersepu/Swagger-Net-Test/blob/master/Swagger_Test/App_Start/SwaggerConfig.cs