模拟swagger抓出入参方法/序列化空对象自动生成对应的json/Class直接转json

swagger里面会自动生成入参和入参预览。

为了实现这种效果,我考虑过以下几个方案:

1.空对象->xml->json

对象在转xml的时候,会自动忽略没有赋值的字段,最后导致显示不全面

2.空对象->json

对象转json的时候,对应的字段会被转成null并显示出来,比如"Name"=null,而不是像swagger一样"Name"="String",而且在一个类里面嵌套另一个类的时候依旧会显示Null。比如会显示"UserInfo":Null,而不是像swagger一样显示

"UserIno":{

"Name"="string"

Age=0

}

为了解决上面的问题,利用反射去对每个属性进行了处理

static void Main(string[] args)
        {
            Dog dog = new Dog();
            People people = new People() {Sex = "nan", BornTime = DateTime.Today};
            JsonSerializerSettings jsSetting = new JsonSerializerSettings();
            jsSetting.Formatting = Formatting.Indented;
            var data = JsonConvert.SerializeObject(GetResopnse(dog), jsSetting);
            Console.WriteLine(data);
            Console.ReadKey();
        }

        public static T GetResopnse<T>(T t)
        {
            var type = t.GetType();
            var str = "String";
            var strList = new List<string>() { "String", "String" };
            var intList = new List<int>() { 0, 1, 2 };
            var count = 0;
            foreach (var pro in type.GetProperties())
            {
                
                if (pro.PropertyType.Namespace.Contains("System"))
                {
                    

                    if (pro.PropertyType.IsGenericType&&pro.PropertyType!=typeof(Nullable<>))
                    {
                        var proNameSpace = pro.PropertyType.GenericTypeArguments[0].Namespace;
                        if (proNameSpace.Contains("System"))
                        {
                            if (pro.PropertyType == typeof(List<string>))
                            {
                                pro.SetValue(t, strList);
                            }

                            if (pro.PropertyType == typeof(List<int>))
                            {
                                pro.SetValue(t, intList);
                            }

                        }
                        else
                        {
                            dynamic instanceList = Activator.CreateInstance(pro.PropertyType);
                            dynamic instance = Activator.CreateInstance(pro.PropertyType.GenericTypeArguments[0]);
                            instance = GetResopnse(instance);
                            pro.SetValue(t, CreateList(instance, instanceList));
                        }
                    }
                    if (!pro.PropertyType.IsClass || pro.PropertyType.IsEnum)
                    {
                        try
                        {
                            pro.SetValue(t, 0);
                        }
                        catch
                        {
                            pro.SetValue(t, default);
                        }
                    }

                    if (pro.PropertyType == typeof(DateTime?) || pro.PropertyType == typeof(DateTime))
                    {
                        pro.SetValue(t, DateTime.Now);
                    }
                    if (pro.PropertyType == typeof(string))
                    {
                        pro.SetValue(t, str);
                    }
                  
                }
                else
                {
                    if (pro.PropertyType.IsEnum)
                    {
                        pro.SetValue(t, default);
                    }
                    else
                    {
                        var instance = Activator.CreateInstance(pro.PropertyType);
                        instance = GetResopnse(instance);
                        pro.SetValue(t, instance);
                    }
                   
                }
                count++;
            }
            return t;
        }

        private static dynamic CreateList<T>(T t,dynamic  f)
        {
            f.Add(t);
            return f;
        }
    }

以这个Dog类为例

最后输出的结果

这样就实现了类似于swagger的展示效果。这个方法有些地方不足,比如一个类三重以上嵌套的时候会出问题,这个bug以后可以用递归改进。

猜你喜欢

转载自blog.csdn.net/qq_38436796/article/details/107672167