文章出處

回到目錄

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

 

感謝您的閱讀!

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()