JsonConverter and Swashbuckle-装饰摇摇欲坠的方法

问题描述 投票:0回答:1

我正在玩耍,并且开发了一个简单的自定义JsonConverter,它需要一个最低和最高温度,并且按照以下方式装饰了我的模型类,并验证了温度是否在该范围内。

[JsonConverter(typeof(TemperatureConverter), 5, 10)]
public int Temperature { get; set; }

这一切都很好,但是我想知道如何在由swashbuckle生成的我的swagger文件中最好地输出正确装饰的方法是这样的:

name: Temperature
          schema:
            type: integer
            minimum: 5
            maximum: 10

我知道这是一个简单的例子,但这是将JsonConverter与我感兴趣的大摇大摆联系起来的方法。

我目前正在查看ISchemaFilter,但看不到如何获得装饰该属性的转换器的类型。

谢谢

json.net asp.net-web-api2 asp.net-core-2.0 asp.net-core-2.1 swashbuckle
1个回答
0
投票

您必须处于父架构级别,查看其属性。到属性本身时,已经太晚了,因为没有链接返回到父类。

我使用的是自定义属性,而不是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];
            }
        }
    }

不幸的是,我的环境当前处于关闭状态,所以我无法对其进行测试,但是我认为这是可行的方法。

© www.soinside.com 2019 - 2024. All rights reserved.