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

一个Json、数组、Dictionary转换和数组对比的C#实例的更多相关文章

  1. JSON 格式的转换: 数组、字符串、List集合、DataTable,实体对象

    JSON验证工具:http://jsonlint.com/JSON简明教程:http://www.w3school.com.cn/json/Newtonsoft.Json类库下载:http://jso ...

  2. Js把IE COM数组列表转换成数组

    今天写组件的时候遇到一个问题,就是当我需要对获取到的对象列表进行删减的时候,发现没有合适的方法,比如: //获取图片列表 var imgs = document.getElementsByTagNam ...

  3. php 字符串内容是数组格式 转换成数组

    一个简单的应用.. 例, $str    =    "array( 'USD'=>'1', 'GBP'=>'0.6494', 'EUR'=>'0.7668' ,'JPY'= ...

  4. Js把对象数组列表转换成数组

    今天写组件的时候遇到一个问题,就是当我需要对获取到的对象列表进行删减的时候,发现没有合适的方法,比如: //获取图片列表 var imgs = document.getElementsByTagNam ...

  5. Java中List与数组互相转换

    1.说明 在Java中,经常遇到需要List与数组互相转换的场景. List转换成数组,可以使用List的toArray()或者toArray(T[] a)方法. 数组转换成List,可以使用Arra ...

  6. JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串;JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象

    JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串:JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象

  7. js中js数组、对象与json之间的转换

    在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键.例如:JSON字符串:var str1 = '{ &quo ...

  8. Linux下利用json-c从一个json数组中提取每一个元素中的部分字段组成一个新json数组

    先把代码贴上来,有时间整理一下 首先说一下要实现的功能: 假定现在有一个json格式的字符串,而且他是一个josn中的数组,比如: [ { "id": "NEW20170 ...

  9. C#中数组、集合(ArrayList)、泛型集合List<T>、字典(dictionary<TKey,TValue>)全面对比

    C#中数组.集合(ArrayList).泛型集合List<T>.字典(dictionary<TKey,TValue>)全面对比 为什么把这4个东西放在一起来说,因为c#中的这4 ...

随机推荐

  1. 201621123012 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1. List中指定元素的删除(题集 ...

  2. “全栈2019”Java第二十五章:流程控制语句中循环语句while

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. AtCoder Grand Contest 031题解

    题面 传送门 题解 比赛的之后做完\(AB\)就开始发呆了--简直菜的一笔啊-- \(A - Colorful\ Subsequence\) 如果第\(i\)个字母选,那么它前面任意一个别的字母的选择 ...

  4. WordPress翻译更新失败解决方法

    编辑php的配置文件:php.ini,搜索并找到disable_functions: 删除disable_functions后面的scandir字符串,保存php.ini: 重载或重启php-fpm服 ...

  5. CH2401 送礼物(双向dfs)

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

  6. CF765F Souvenirs 离线+线段树+主席树

    $ \color{#0066ff}{ 题目描述 }$ A县旁,连绵着一条长度为 n 的山脉,这条山脉由 n 座山峰组成,第 i 座山 峰的高度为 ai.作为著名的旅游县城,每天来到山脉游玩的旅客络绎不 ...

  7. 使用bootstrap-table插件

    1.用户提交信息过滤表格内容: a.设置表格查询参数,并在用户提交按钮时候更新表格 <form id="current_table" class="form-inl ...

  8. 2016级算法第四次上机-E.Bamboo and the Ancient Spell

    Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应 ...

  9. Python多继承解析顺序的C3线性算法流程解析

    Python多继承MRO 在Python2.1中,采用了经典类,使用深度优先算法解析. Python2.2中,引入了新式类,使用深度优先算法和广度优先算法. 在Python2.3以后的版本中,经典类和 ...

  10. C# 进程通信SendMessage和有关消息参数

    SendMessage是啥? 函数原型: LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)SendMessage( ...