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以后可以用递归改进。