JsonConverter 和 Swashbuckle - 装饰 swagger 的方法
JsonConverter and Swashbuckle - Approach for decorating a swagger
我正在玩弄并开发了一个简单的自定义 JsonConverter,它采用最小和最大温度并按如下方式装饰我的模型 class 并验证温度是否在该范围内。
[JsonConverter(typeof(TemperatureConverter), 5, 10)]
public int Temperature { get; set; }
一切都很好,但我想知道在 swashbuckle 生成的我的 swagger 文件中最好输出正确装饰的方法是什么...像这样:
name: Temperature
schema:
type: integer
minimum: 5
maximum: 10
我知道这是一个微不足道的例子,但更多的是将 JsonConverter 与我感兴趣的 swagger 的生成联系起来的方法。
我目前正在查看 ISchemaFilter,但看不到如何获得修饰 属性 的转换器类型。
谢谢
您必须在父架构级别查看它的属性。当它到达 属性 本身时,为时已晚,因为没有 link 返回父级 class。
我使用的是自定义属性,而不是 JsonConverter,但像这样的东西应该可以检测属性。
public class TemperatureSchemaFilter : ISchemaFilter
{
public void Apply(Schema schema, SchemaFilterContext context)
{
var converterProperties = context.SystemType.GetProperties().Where(
prop => prop.CustomAttributes.Select(
attr => attr.AttributeType == typeof(JsonConverterAttribute)).Any()
).ToList();
foreach (var converterProperty in converterProperties)
{
var converterAttribute = (JsonConverterAttribute)Attribute.GetCustomAttribute(converterProperty.PropertyType, typeof(JsonConverterAttribute));
if (converterAttribute.ConverterType != typeof(TemperatureConverter)) continue;
Schema propertySchema = null;
try
{
propertySchema = schema.Properties.First(x => x.Key.ToLower().Equals(converterProperty.Name.ToLower())).Value;
}
catch (Exception)
{
continue;
}
if (propertySchema == null) continue;
propertySchema.Minimum = (double) converterAttribute.ConverterParameters[0];
propertySchema.Maximum = (double) converterAttribute.ConverterParameters[1];
}
}
}
不幸的是,我的环境目前已被清理,所以我无法对其进行测试,但我认为这是可行的方法。
我正在玩弄并开发了一个简单的自定义 JsonConverter,它采用最小和最大温度并按如下方式装饰我的模型 class 并验证温度是否在该范围内。
[JsonConverter(typeof(TemperatureConverter), 5, 10)]
public int Temperature { get; set; }
一切都很好,但我想知道在 swashbuckle 生成的我的 swagger 文件中最好输出正确装饰的方法是什么...像这样:
name: Temperature
schema:
type: integer
minimum: 5
maximum: 10
我知道这是一个微不足道的例子,但更多的是将 JsonConverter 与我感兴趣的 swagger 的生成联系起来的方法。
我目前正在查看 ISchemaFilter,但看不到如何获得修饰 属性 的转换器类型。
谢谢
您必须在父架构级别查看它的属性。当它到达 属性 本身时,为时已晚,因为没有 link 返回父级 class。
我使用的是自定义属性,而不是 JsonConverter,但像这样的东西应该可以检测属性。
public class TemperatureSchemaFilter : ISchemaFilter
{
public void Apply(Schema schema, SchemaFilterContext context)
{
var converterProperties = context.SystemType.GetProperties().Where(
prop => prop.CustomAttributes.Select(
attr => attr.AttributeType == typeof(JsonConverterAttribute)).Any()
).ToList();
foreach (var converterProperty in converterProperties)
{
var converterAttribute = (JsonConverterAttribute)Attribute.GetCustomAttribute(converterProperty.PropertyType, typeof(JsonConverterAttribute));
if (converterAttribute.ConverterType != typeof(TemperatureConverter)) continue;
Schema propertySchema = null;
try
{
propertySchema = schema.Properties.First(x => x.Key.ToLower().Equals(converterProperty.Name.ToLower())).Value;
}
catch (Exception)
{
continue;
}
if (propertySchema == null) continue;
propertySchema.Minimum = (double) converterAttribute.ConverterParameters[0];
propertySchema.Maximum = (double) converterAttribute.ConverterParameters[1];
}
}
}
不幸的是,我的环境目前已被清理,所以我无法对其进行测试,但我认为这是可行的方法。