一个Json、数组、Dictionary转换和数组对比的C#实例
最近做了一个程序,里面一段代码用到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原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究责任的权利。如有问题,可以通过站内信联系我,非常感谢。