最近做了一個程序,里面一段代碼用到Json、數組、Dictionary轉換和數組對比的一些知識,雖然在實際碰到類似問題時候有更好的方法,但這就當是一次基礎知識的回顧,現在分享一下。
先介紹下要實現的業務:
有幾個批處理程序在運行,每次運行完寫log到數據庫,我又寫的一個程序每天遍歷log中顯示成功的批處理,跟需要運行的批處理總數做對比,如果某個批處理沒有成功運行,就把這個批處理名發短信到我手機。
其中用到了一個json的類庫,Json.Net, 下載地址https://www.newtonsoft.com/json,一個很常用的開源類庫,下載后引用即可;
另外需要進行json的序列化和反序列化等操作,單獨使用了一個幫助類,jsonhelper.cs,代碼如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using System.IO; namespace Alert_Send_Message { /// <summary> /// Json幫助類 /// </summary> public class JsonHelper { /// <summary> /// 將對象序列化為JSON格式 /// </summary> /// <param name="o">對象</param> /// <returns>json字符串</returns> public static string SerializeObject(object o) { string json = JsonConvert.SerializeObject(o); return json; } /// <summary> /// 解析JSON字符串生成對象實體 /// </summary> /// <typeparam name="T">對象類型</typeparam> /// <param name="json">json字符串(eg.{"ID":"112","Name":"石子兒"})</param> /// <returns>對象實體</returns> public static T DeserializeJsonToObject<T>(string json) where T : class { JsonSerializer serializer = new JsonSerializer(); StringReader sr = new StringReader(json); object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T)); T t = o as T; return t; } /// <summary> /// 解析JSON數組生成對象實體集合 /// </summary> /// <typeparam name="T">對象類型</typeparam> /// <param name="json">json數組字符串(eg.[{"ID":"112","Name":"石子兒"}])</param> /// <returns>對象實體集合</returns> public static List<T> DeserializeJsonToList<T>(string json) where T : class { JsonSerializer serializer = new JsonSerializer(); StringReader sr = new StringReader(json); object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List<T>)); List<T> list = o as List<T>; return list; } /// <summary> /// 反序列化JSON到給定的匿名對象. /// </summary> /// <typeparam name="T">匿名對象類型</typeparam> /// <param name="json">json字符串</param> /// <param name="anonymousTypeObject">匿名對象</param> /// <returns>匿名對象</returns> public static T DeserializeAnonymousType<T>(string json, T anonymousTypeObject) { T t = JsonConvert.DeserializeAnonymousType(json, anonymousTypeObject); return t; } } }
程序主代碼:
<!--app.config-->
<!--短信接收人設置--> <add key="phoneNum" value="123456,345678"/>
<!--所有批處理程序名集合json格式(這個程序名因為后期可能會變,所以寫在了config里方便配置)-->
<!--當然最好是寫在數據庫里,那就沒json什么事了-->
<add key="instanceName" value="[{'LOG_TYPE':'p1','TYPE_NAME':'ws_conon'},{'LOG_TYPE':'p5','TYPE_NAME':'ws_con'}]" />
/// <summary> /// 主程序代碼 /// </summary> if (ds.Tables != null && ds.Tables.Count !=0)//ds.Tables中放入的是成功運行的程序名 { //從config中獲取需要序列化的json數據,並轉換為字符串 string str_instance = GetAppConfig("instanceName").ToString().Replace("'", "\""); //使用JsonHelper類將字符串序列化為List,注意要調用下面的轉換實體類<instanceName> List<instanceNmae> json_instance = JsonHelper.DeserializeJsonToList<instanceNmae>(str_instance); //將List轉換為Dictionary Dictionary<string, string> instanceDictionary = json_instance.ToDictionary(key => key.LOG_TYPE, value => value.TYPE_NAME); //將ds.Tables中成功運行的程序代號放入數組,本操作使用Linq,需要引用命名空間 using System.Linq string[] arrRate = ds.Tables[0].AsEnumerable().Select(d => d.Field<string>("LOG_TYPE")).ToArray(); //遍歷需要運行的程序總數集合,將程序代號放入List List<string> strLogTypeList = new List<string>(); for (int i = 0; i < json_instance.Count; i++) { strLogTypeList.Add(json_instance[i].LOG_TYPE); } //將需要運行的總程序集合List轉換為數組 string[] arrType = strLogTypeList.ToArray();//進程名集合 //數組對比 string[] arrNew = arrType.Except(arrRate).ToArray();//對比當天沒有運行的進程 if (arrNew.Length != 0) { string _typeName = ""; for (int i = 0; i < arrNew.Length; i++) { string _log_type = arrNew[i]; _typeName += "[" + instanceDictionary[_log_type] + "]"; } string _log_time = DateTime.Now.AddDays(-1).ToString("yyyyMMdd");//前一天日期 //從config中獲取接收短信人的電話號碼並放入字符串 string phoneNum = string.Format(GetAppConfig("phoneNum")); //對字符串分列,放入數組 string[] phoneArry = phoneNum.Split(new char[] { ',' }); string content = string.Format("管理員您好,{0}程序{1}未運行,請注意檢查!", _typeName, _log_time); //發送短信方法 send_message(phoneArry, content); } else { string phoneNum = string.Format(GetAppConfig("phoneNum")); string[] phoneArry = phoneNum.Split(new char[] { ',' }); string _log_time = DateTime.Now.AddDays(-1).ToString("yyyyMMdd");//前一天日期 string content = string.Format("管理員您好,{0}程序運行正常!", _log_time); //發送短信方法 send_message(phoneArry, content); } } /// <summary> /// Json序列化實體類 /// </summary> public class instanceNmae { public string LOG_TYPE { get; set; } public string TYPE_NAME { get; set; } }
單獨說一下數組的數據對比:
//實例 string[] arrA = new string[] { "a", "b", "c", "d" };//A string[] arrB = new string[] { "c", "d", "e" };//B string[] arrSame = arrA.Intersect(arrB).ToArray();//相同的數據 (結果:c,d) string[] arrAB = arrA.Except(arrB).ToArray();//A中有B中沒有的 (結果:a,b) string[] arrBA = arrB.Except(arrA).ToArray();//B中有A中沒有的 (結果:e)
版權聲明:
本文由KyleLi原創並發布於博客園,歡迎轉載,未經本人同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究責任的權利。如有問題,可以通過站內信聯系我,非常感謝。