同事遇到一个问题:在做手机app接口时,返回JSON格式,json里面的数据属性均是string类型,但不能出现NULL(手机端那边说处理很麻烦,哎)。Model已经创建好了,而且model的每个属性均是string类型。数据层使用EF。数据库也有些字段可为空。这时,需要大量的验证属性是否为NULL,并将属性值为NULL的转换成"".
解决方案:1遍历model各个属性,当为NULL时,赋值"".2.支持泛型List<model>的嵌套。
前提条件:model的值只有这几种,List<model> ,string ,多层嵌套。
于是写了如下代码遍历属性,遇到很多问题,初稿,临时用,后面完善。
/// <summary> /// 去除model属性为null 的情况,把null改成""。。该方法仅用在属性均为string类型的情况,主要用于手机APP。 chj 2015-5-7 17:39:21 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="inputModel"></param> /// <returns></returns> public static object CJRemoveNULLByRecursive(object obj) { Type t = obj.GetType(); var typeArr = t.GetPRoperties(); object tempItem;//应对属性含有参数时。 if (obj != null ) { foreach (var pi in typeArr) { //当属性为字符串时 if (pi.PropertyType == typeof(string)) { if (pi.GetValue(obj, null)==null) { pi.SetValue(obj, "", null); } } //当该属性为List泛型时,或者为引用类型,数组时。这里好像有个属性可以直接判断 else if(pi.PropertyType.IsGenericType||pi.PropertyType.IsArray||pi.PropertyType.IsClass)//.GetType()=typeof(Nullable)) { var paras= pi.GetIndexParameters(); //索引化属性的参数列表 if (paras.Count()> 0) { int i = 0; tempItem = pi.GetValue(obj, new object[] { 0 }); while (tempItem!=null) { pi.SetValue(obj, CJRemoveNULLByRecursive(tempItem), new object[] { i }); i++; try { tempItem = pi.GetValue(obj, new object[] { i }); } catch (Exception) { break; } } } else { pi.SetValue(obj, CJRemoveNULLByRecursive(pi.GetValue(obj, null)), null); } } } } else { return ""; } return obj; }
由于可能嵌套多层,使用递归。
临时方案,留在这,后面不定期完善中。。。
新闻热点
疑难解答