面向云技术架构 - 痴者工良

  • 首页
  • 工良写的电子书
    • Istio 入门教程
    • kubernetes 教程
    • 从 C# 入门 Kafka
    • 多线程和异步
    • 动态编程-反射、特性、AOP
    • 表达式树
  • 本站文章导航
  • 隐私政策
愿有人陪你颠沛流离
遇到能让你付出的事物或者人,都是一种运气。
能遇到,就该珍惜。或许你们最终没能在一起,但你会切实地感受到力量。
正因为这样,那段相遇才变得有价值,才没有辜负这世间的每一段相遇。
  1. 首页
  2. .NET
  3. 正文

ASP.NET Core 模型类类型转换,swagger 对不上

2023年9月19日 60点热度 0人点赞 0条评论
内容纲要

模型类:

    public class Test
    {
        [JsonConverter(typeof(string))]
        public int Value { get; set; }
    }

API 接口:

        [HttpPost("aaa")]
        public string AAA([FromBody] Test test)
        {
            return "11111111111";
        }

但是 Swagger 还是显示 int 类型,没有跟着 json 配置而变化。
所以我们需要配置 Swagger,显示转换类型之后正确的类型信息。

定义一个过滤器:

        public class CustomSchemaFilter : ISchemaFilter
        {
            public void Apply(OpenApiSchema schema, SchemaFilterContext context)
            {
                // 模型类的类型
                var type = context.Type;

                // 获取类型的所有属性
                PropertyInfo[] ps = context.Type.GetProperties();

                // 获取 swagger 文件显示的所有属性
                // 注意文档属性是已经已经生成的,这里进行后期转换,替换为需要显示的类型
                foreach (var property in schema.Properties)
                {
                    var p = ps.FirstOrDefault(x => x.Name.ToLower() == property.Key.ToLower());
                    if (p == null) continue;
                    var t = property.Value.Type;
                    var converter = p.GetCustomAttribute<JsonConverterAttribute>();
                    if (converter == null || converter.ConverterType == null) continue;

                    //// 显示为需要的类型
                    //if (p.PropertyType == typeof(int) && converter.ConverterType == typeof(string))
                    //{
                    //  property.Value.Type = "string";
                    //}

                    var targetType = TypeInfo.GetTypeCode(converter.ConverterType);

                    // 如果是基元类型
                    if(p.PropertyType.IsPrimitive && converter.ConverterType.IsPrimitive)
                    {
                        switch (targetType)
                        {
                            case TypeCode.Boolean: property.Value.Type = "boolean"; break;
                            case TypeCode.Char: property.Value.Type = "string"; break;
                            case TypeCode.SByte: property.Value.Type = "integer"; break;
                            case TypeCode.Byte: property.Value.Type = "integer"; break;
                            case TypeCode.Int16: property.Value.Type = "integer"; break;
                            case TypeCode.UInt16: property.Value.Type = "integer"; break;
                            case TypeCode.Int32: property.Value.Type = "integer"; break;
                            case TypeCode.UInt32: property.Value.Type = "integer"; break;
                            case TypeCode.Int64: property.Value.Type = "integer"; break;
                            case TypeCode.UInt64: property.Value.Type = "integer"; break;
                            case TypeCode.Single: property.Value.Type = "number"; break;
                            case TypeCode.Double: property.Value.Type = "number"; break;
                            case TypeCode.Decimal: property.Value.Type = "number"; break;
                            case TypeCode.DateTime: property.Value.Type = "string"; break;
                            case TypeCode.String: property.Value.Type = "string"; break;
                        }
                    }
                }
            }
        }

一般不需要处理对象,如果有需要,可以使用:

case TypeCode.Object: property.Value.Type = p.PropertyType.Name;break;

然后配置 Swagger 服务。

            builder.Services.AddSwaggerGen(options =>
            {
                options.SchemaFilter<CustomSchemaFilter>();
            });

对应的基元类型在 Swagger 中显示的类型:

    public class Test
    {
        public Boolean Value1 { get; set; }
        public char Value2 { get; set; }
        public sbyte Value3 { get; set; }
        public byte Value4 { get; set; }
        public Int16 Value5 { get; set; }
        public UInt16 Value6 { get; set; }
        public Int32 Value7 { get; set; }
        public UInt32 Value8 { get; set; }
        public Int64 Value9 { get; set; }
        public UInt64 Value { get; set; }
        public Single Value10 { get; set; }
        public Double Value11 { get; set; }
        public Decimal Value12 { get; set; }
        public DateTime Value13 { get; set; }
        public String Value14 { get; set; }
    }
{
value1  boolean
value2  string
value3  integer($int32)
value4  integer($int32)
value5  integer($int32)
value6  integer($int32)
value7  integer($int32)
value8  integer($int32)
value9  integer($int64)
value   integer($int64)
value10 number($float)
value11 number($double)
value12 number($double)
value13 string($date-time)
value14 string
}
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: asp core net swagger 类型转换
最后更新:2023年9月19日

痴者工良

高级程序员劝退师

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2023 whuanle.cn. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备18051778号

粤公网安备 44030902003257号