前些日子將項目由使用數據庫改版為使用接口,由於接口返回的xml中多了一些附加信息,導致xml轉化後的DataTable無法儲存在MemCache中。這時可以將xml序列化為其對應的類,當然由於當時對xml的序列化使用不多所以改為接收json轉化為對應的類,這裡主要展示我如何使用json的。
在接收到傳過來的json字符串後,使用JsonConvert.DeserializeObject<T>(string value);轉化為相應的類型。於是我寫下了需要轉化的第一個類型,如下:
/// <summary> /// 用於序列化json字符串 /// </summary> public class JsonSet { public string message{set;get;} public string code { set; get; } public DataTable entitylist { set; get; } }
然後改造接口調用中間函數
private static bool GetJsonSearchData<T>(string param, string url, string method, int length, ref T jsonResult, string encodeWay = "gb2312") { bool isSucc = true; StringBuilder sb = GetSearchData(param, url, method, length, encodeWay); if (sb != null && sb.Length > 0) { try { jsonResult = JsonConvert.DeserializeObject<T>(sb.ToString()); } catch { isSucc = false; } } return isSucc; }
使用方法如:
1 JsonSet jset = new JsonSet(); 2 SearchInterface.PostSearchData<JsonSet>(parms, url, ref jset); 3 if (jset != null && jset.entitylist != null) 4 { 5 return jset.entitylist; 6 }
由於完全貼合json字符格式創建的類,返回的DataTable格式就是標准的格式,解決了在Memcache中存儲的問題。後來在使用中發現原先需要將DataTable轉化為相應的對象,如果直接將json轉化為相應對象,豈不是要省點事。但項目中所用的類如果都要改造的話改動太多,也不方便,後來發現json字符串相對這些類僅多了code、message兩個屬性,於是將對象改造為如下
1 public class JsonTList<T> 2 { 3 public string code { set; get; } 4 public string message { set; get; } 5 public List<T> entitylist { set; get; } 6 }
使用方式如
1 JsonTList<AgtInfoEntity> jT = new JsonTList<AgtInfoEntity>(); 2 SearchInterface.PostSearchData<JsonTList<AgtInfoEntity>>(parms, url, ref jT); 3 if (jT != null && jT.entitylist != null && jT.entitylist.Count > 0) 4 { 5 agtInfoEntity = jT.entitylist; 6 CacheManager.Set(cacheName, agtInfoEntity); 7 }
由此就形成了我們新的接口體系。