WebApi系列(lie)~按(an)需序列(lie)化字段~Hot
起初只是一個想法,一次討論,一個設想,但相信一定可以實現,具體的事情是這樣的,有個對外的API項目,它為一些終端設備提供數據,如手機,平板,PC,當然你也可以說它為很多平臺提供數據win32,mac,ios,android,對于PC設備來說,接口返回的數據量當然沒有那么敏感,但對于移動設備,對這點要求就高些,不需要的數據請不要為我返回,因為那么會發費我很多流量!
是的,這是2010年到未來(lai)某個時期(qi)的熱門話(hua)題,網絡帶(dai)寬(kuan)是收(shou)費(fei)(fei)的,不要(yao)隨便浪費(fei)(fei)!
第一次想法失敗了
終端-〉請求數據包-〉服務端接口接改(gai)并(bing)(bing)處理-〉數據返回并(bing)(bing)過濾無(wu)用字段
這個(ge)模型在(zai)我的(de)大腦里呈現,但經過實踐的(de)證明,很遺憾,它是無法實現的(de),因(yin)為(wei)(wei)你不(bu)(bu)能為(wei)(wei)每個(ge)屬性(xing)動(dong)態(tai)去添加一(yi)種(zhong)叫做JsonIgnore的(de)特(te)(te)性(xing)(不(bu)(bu)會被序列化(hua)),因(yin)為(wei)(wei)這種(zhong)特(te)(te)性(xing)屬于(yu)一(yi)種(zhong)元信息(xi),我們在(zai)程序運行時,只(zhi)能獲取它,設置它的(de)值(zhi),而不(bu)(bu)能添加或者(zhe)移除它(反(fan)射(she)),當(dang)然,你可以從(cong)新動(dong)態(tai)創建一(yi)個(ge)類,一(yi)個(ge)類的(de)方法和屬性(xing)(Emit)
第二次想法成功了
數(shu)據(ju)層(ceng)和業務層(ceng)在服(fu)務端去(qu)干(gan)自己(ji)的(de)(de)事(shi),返(fan)回(hui)自己(ji)完整(zheng)的(de)(de)數(shu)據(ju)吧,我(wo)不(bu)(bu)去(qu)關(guan)心它(ta),我(wo)關(guan)心的(de)(de)是在API返(fan)回(hui)數(shu)據(ju)時的(de)(de)動作(序(xu)(xu)列化),所(suo)以第(di)二(er)(er)次想法出來了(le)(le),將實體對(dui)象在進(jin)行(xing)JSON序(xu)(xu)列化時進(jin)行(xing)加工,將不(bu)(bu)需(xu)要的(de)(de)字段(duan)從JSON字符(fu)串中去(qu)掉,就OK了(le)(le),注(zhu)意本代碼(ma)只是第(di)一版(ban),目前(qian)還不(bu)(bu)支(zhi)持JSON的(de)(de)嵌套屬性,這(zhe)個遞歸我(wo)打算在第(di)二(er)(er)版(ban)再實現它(ta),呵呵,不(bu)(bu)想讓它(ta)太復雜!
下面是我的代碼
/// <summary> /// 功能:集合按需要序列化 /// author:倉儲大叔 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> /// <param name="fun"></param> /// <returns></returns> public static string ToJson(this object type, params string[] param) { StringBuilder buffer = new StringBuilder(); if (type.GetType().Name == "List`1") { buffer.Insert(0, "["); foreach (var t in (IEnumerable<object>)type) { GeneratorJsonStr(buffer, t, param); } buffer.Append("]"); } else { GeneratorJsonStr(buffer, type, param); } return buffer.ToString(); } /// <summary> /// 為對象生成Json字符(fu)串 /// </summary> /// <param name="buffer"></param> /// <param name="t"></param> /// <param name="param"></param> static void GeneratorJsonStr(StringBuilder buffer, object t, params string[] param) { var obj = new List<string>(); foreach (var item in param) { var p = t.GetType().GetProperty(item, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (p != null) { if (p.PropertyType == typeof(string)) obj.Add(p.Name + ":\"" + p.GetValue(t) + "\""); else obj.Add(p.Name + ":" + p.GetValue(t)); } } if (obj.Count > 0) buffer.Append("{" + string.Join(",", obj) + "}"); }
感謝您的閱讀!