У меня есть этот класс:
public class CostDto
{
public int Id{ get; set; }
public decimal? Price { get; set; }
}
В чванстве это показывает это:
{
"Id": 0,
"Price": 0
}
И я бы предпочел это:
{
"Id": 0,
"Price": 0.00
}
Это более четко укажет пользователю, что возвращаемое значение Price
имеет десятичный, а не целочисленный тип. Возможно ли это вообще в чванстве?
Я нашел несколько сообщений, относящихся к чему-то подобному, но, похоже, это не работает:
services.AddSwaggerGen(options =>
{
options.MapType<decimal>(() => new OpenApiSchema { Type = "number", Format = "decimal" });
options.MapType<decimal?>(() => new OpenApiSchema { Type = "number", Format = "decimal", Nullable = true });
});
Вы можете попробовать это:
public class DecimalSchemaFilter : ISchemaFilter
{
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
if (schema.Type == "number" && schema.Format == "decimal")
{
schema.Example = OpenApiAnyFactory.CreateFromJson("0.01");
}
}
}
services.AddSwaggerGen(options =>
{
options.SchemaFilter<DecimalSchemaFilter>();
options.MapType<decimal>(() => new OpenApiSchema { Type = "number", Format = "decimal" });
options.MapType<decimal?>(() => new OpenApiSchema { Type = "number", Format = "decimal", Nullable = true });
});
Отлично, добавлю.
Пользовательский интерфейс Swagger удаляет нулевую десятичную часть чисел с плавающей запятой в отображаемых примерах. Это известное поведение: https://github.com/swagger-api/swagger-ui/issues/7337
В качестве обходного пути вы можете указать собственное значение example
с ненулевой десятичной частью:
public class CostDto
{
public int Id{ get; set; }
/// <example>12.34</example>
public decimal? Price { get; set; }
}
Спасибо! Это сработало, за исключением того, что мне пришлось использовать «schema.Example = OpenApiAnyFactory.CreateFromJson(»0.01»);» потому что «CreateFor» устарел, а 0,00 всегда сокращается до 0. Может быть, вы можете добавить это в свой ответ? Я использую Swashbuckle 6.6.1.