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];
            }
        }
    }

不幸的是,我的环境目前已被清理,所以我无法对其进行测试,但我认为这是可行的方法。