WebApi系列~按需序列化欄位~Hot

張佔嶺發表於2015-11-10

回到目錄

起初只是一個想法,一次討論,一個設想,但相信一定可以實現,具體的事情是這樣的,有個對外的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) + "}");
        }

 

感謝您的閱讀!

回到目錄

相關文章