文章出處
文章列表
起初只是一個想法,一次討論,一個設想,但相信一定可以實現,具體的事情是這樣的,有個對外的API項目,它為一些終端設備提供數據,如手機,平板,PC,當然你也可以說它為很多平臺提供數據win32,mac,ios,android,對于PC設備來說,接口返回的數據量當然沒有那么敏感,但對于移動設備,對這點要求就高些,不需要的數據請不要為我返回,因為那么會發費我很多流量!
是的,這是2010年到未來某個時期的熱門話題,網絡帶寬是收費的,不要隨便浪費!
第一次想法失敗了
終端-〉請求數據包-〉服務端接口接改并處理-〉數據返回并過濾無用字段
這個模型在我的大腦里呈現,但經過實踐的證明,很遺憾,它是無法實現的,因為你不能為每個屬性動態去添加一種叫做JsonIgnore的特性(不會被序列化),因為這種特性屬于一種元信息,我們在程序運行時,只能獲取它,設置它的值,而不能添加或者移除它(反射),當然,你可以從新動態創建一個類,一個類的方法和屬性(Emit)
第二次想法成功了
數據層和業務層在服務端去干自己的事,返回自己完整的數據吧,我不去關心它,我關心的是在API返回數據時的動作(序列化),所以第二次想法出來了,將實體對象在進行JSON序列化時進行加工,將不需要的字段從JSON字符串中去掉,就OK了,注意本代碼只是第一版,目前還不支持JSON的嵌套屬性,這個遞歸我打算在第二版再實現它,呵呵,不想讓它太復雜!
下面是我的代碼
/// <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字符串 /// </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) + "}"); }
感謝您的閱讀!
文章列表
全站熱搜