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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM