Как я могу заставить Swashbuckle производить Swagger-свойства с датой (без времени)? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть класс, который открывается через 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(); для генерации контракта Swagger с Swashbuckle, результат выглядит следующим образом:

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

Я бы хотел настроить Swashbuckle для распознавания моего DateFormatConverter класса и соответственно обрабатывать формат.

Я пытался options.SchemaFilter<DateFormatSchemaFilter>() в своем классе Startup, но фильтр не имеет контекста свойства, поэтому, если я не хочу, чтобы все объекты DateTime были date, это не ' Т приемлемый вариант.

1 Ответ

0 голосов
/ 15 мая 2018

Вот как вы можете изменить "date-time" на "date" с помощью фильтра iDocumentFilter:

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); - класс, который будет сканироваться для поиска дат с помощью пользовательских атрибутов.

И, конечно, этот код не предназначен для копирования / вставки, это всего лишь небольшой пример того, что вы можете сделать с IDocumentFilter


Другой вариант будет использовать NodaTime , а затем использовать NodaTime.LocalDate для тех свойств, которые должны быть просто датами, а в вашей конфигурации сваггера использовать MapType

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


У меня есть оба эти варианта работы на этом примере:
http://swagger -net-test.azurewebsites.net / чванство / щ / индекс? Фильтр = Дата # / Дата / Date_Post

А код, стоящий за этим, находится на github:
https://github.com/heldersepu/Swagger-Net-Test/blob/master/Swagger_Test/App_Start/SwaggerConfig.cs

...