我正在玩耍,并且开发了一个简单的自定义JsonConverter,它需要一个最低和最高温度,并且按照以下方式装饰了我的模型类,并验证了温度是否在该范围内。
[JsonConverter(typeof(TemperatureConverter), 5, 10)]
public int Temperature { get; set; }
这一切都很好,但是我想知道如何在由swashbuckle生成的我的swagger文件中最好地输出正确装饰的方法是这样的:
name: Temperature
schema:
type: integer
minimum: 5
maximum: 10
我知道这是一个简单的例子,但这是将JsonConverter与我感兴趣的大摇大摆联系起来的方法。
我目前正在查看ISchemaFilter,但看不到如何获得装饰该属性的转换器的类型。
谢谢
您必须处于父架构级别,查看其属性。到属性本身时,已经太晚了,因为没有链接返回到父类。
我使用的是自定义属性,而不是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];
}
}
}
不幸的是,我的环境当前处于关闭状态,所以我无法对其进行测试,但是我认为这是可行的方法。