最近做了一個程序,里面一段代碼用到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原創並發布於博客園,歡迎轉載,未經本人同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究責任的權利。如有問題,可以通過站內信聯系我,非常感謝。
