1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Runtime.Serialization.Json;
  7. using System.Xml.Serialization;
  8. using System.Web.Script.Serialization;
  9.  
  10. namespace Common
  11. {
  12. public class JsonHelper
  13. {
  14. /// <summary>
  15. /// 序列化
  16. /// </summary>
  17. /// <typeparam name="T"></typeparam>
  18. /// <param name="obj"></param>
  19. /// <returns></returns>
  20. public static string GetJson<T>(T obj)
  21. {
  22. if (obj == null) return null;
  23. DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
  24. using (MemoryStream stream = new MemoryStream())
  25. {
  26. json.WriteObject(stream, obj);
  27. return Encoding.UTF8.GetString(stream.ToArray(), , stream.ToArray().Length);
  28. }
  29. }
  30.  
  31. /// <summary>
  32. /// 反序列化
  33. /// </summary>
  34. /// <typeparam name="T"></typeparam>
  35. /// <param name="szJson"></param>
  36. /// <returns></returns>
  37. public static T ParseFromJson<T>(string szJson)
  38. {
  39. if (string.IsNullOrEmpty(szJson))
  40. return default(T);
           //xml内容乱码可正确转换 using (var ms = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(szJson), XmlDictionaryReaderQuotas.Max))
  41. using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
  42. {
  43. var serializer = new DataContractJsonSerializer(typeof(T));
  44. return (T)serializer.ReadObject(ms);
  45. }
  46. }
  47.  
  48. /// <summary>
  49. /// 对未知或匿名对象进行Json序列化。
  50. /// </summary>
  51. /// <param name="value"></param>
  52. /// <returns></returns>
  53. public static string GetUnknownJson(object value)
  54. {
  55. if (value == null) return null;
  56. return new JavaScriptSerializer().Serialize(value);
  57. }
  58. /// <summary>
  59. /// DataContractJson序列化,用于序列化里面附带未知类型的实体。
  60. /// </summary>
  61. /// <param name="value"></param>
  62. /// <param name="knownTypes">知道类型</param>
  63. /// <returns></returns>
  64. public static string GetJson(object value, IEnumerable<Type> knownTypes)
  65. {
  66. if (value == null) return null;
  67. using (var ms = new MemoryStream())
  68. {
  69. new DataContractJsonSerializer(value.GetType(), knownTypes).WriteObject(ms, value);
  70. return Encoding.UTF8.GetString(ms.ToArray());
  71. }
  72. }
  73.  
  74. #region 序列化文件和反序列化
  75.  
  76. /// <summary>
  77. /// 通用类的保存函数,可以将已经声明过可序列化的类以文件方式保存起来。
  78. /// 保存格式分为 XML明文式和 二进制。
  79. /// 如果目标目录不存在,就自动创建目录。
  80. /// </summary>
  81. /// <typeparam name="T">要保存的类的类型</typeparam>
  82. /// <param name="tclass">要保存的类</param>
  83. /// <param name="sFilePath">要保存的文件完整路径,包括文件名。</param>
  84. /// <param name="bXmlOrBin">true=XML,false=Bin</param>
  85. /// <exception cref="System.Exception"></exception>
  86. public void Save<T>(T tclass, string sFilePath, bool bXmlOrBin)
  87. {
  88. //目录检查
  89. string sFolder = sFilePath.Substring(, sFilePath.LastIndexOf("\\"));
  90. if (!Directory.Exists(sFolder)) Directory.CreateDirectory(sFolder);
  91.  
  92. using (FileStream fs = new FileStream(sFilePath, FileMode.Create, FileAccess.Write))
  93. {
  94. if (bXmlOrBin)
  95. {
  96. using (MemoryStream stream = Serialize<T>(tclass, bXmlOrBin))
  97. {
  98. stream.WriteTo(fs);
  99. stream.Close();
  100. }
  101. }
  102. else
  103. {
  104. System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = null;
  105. bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
  106. bf.Serialize(fs, bXmlOrBin);
  107. }
  108. fs.Close();
  109. }
  110. }
  111.  
  112. /// <summary>
  113. /// 从文件加载保存的信息,然后反序列化并返回保存的信息。
  114. /// 如果要读取的文件不存在会引发异常。
  115. /// </summary>
  116. /// <typeparam name="T">类型</typeparam>
  117. /// <param name="tclass">要返回的类,失败返回默认</param>
  118. /// <param name="sFilePath">文件路径</param>
  119. /// <param name="bXmlOrBin">true=XML,false=Bin</param>
  120. /// <exception cref="System.Exception"></exception>
  121. /// <exception cref="System.IO.IOException">文件不存在</exception>
  122. public void Load<T>(out T tclass, string sFilePath, bool bXmlOrBin)
  123. {
  124. if (!File.Exists(sFilePath))
  125. {
  126. tclass = default(T);
  127. return;
  128. //throw new IOException("要访问的文件不存在。");
  129. }
  130. using (FileStream fs = new FileStream(sFilePath, FileMode.Open, FileAccess.Read))
  131. {
  132. tclass = Deserialize<T>(fs, bXmlOrBin);
  133. fs.Close();
  134. }
  135. }
  136.  
  137. /// <summary>
  138. /// 将传入的某个模型序列化,并返回其数据量,用于保存到文件里面。
  139. /// 提供序列化到XML或二进制。
  140. /// </summary>
  141. /// <typeparam name="T">类的类型</typeparam>
  142. /// <param name="model">要序列化的模型</param>
  143. /// <param name="bXmlOrBin">true=xml序列化,false=二进制序列化</param>
  144. /// <returns></returns>
  145. /// <exception cref="System.Exception"></exception>
  146. public MemoryStream Serialize<T>(T model, bool bXmlOrBin = true)
  147. {
  148. MemoryStream stream = new MemoryStream();
  149. if (bXmlOrBin)
  150. {
  151. XmlSerializer serializer = new XmlSerializer(typeof(T));
  152. serializer.Serialize(stream, model);
  153. }
  154. else
  155. {
  156. var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
  157. bf.Serialize(stream, model);
  158. }
  159. stream.Position = ;
  160. return stream;
  161. }
  162.  
  163. /// <summary>
  164. /// 将传入的数据量进行反序列化。
  165. /// </summary>
  166. /// <typeparam name="T">类的类型</typeparam>
  167. /// <param name="stream">要反序列化的流</param>
  168. /// <param name="bXmlOrBin">true=xml序列化,false=二进制序列化</param>
  169. /// <returns></returns>
  170. public T Deserialize<T>(Stream stream, bool bXmlOrBin = true)
  171. {
  172. T model = default(T);
  173. using (var newstream = stream)
  174. {
  175. if (bXmlOrBin)
  176. {
  177. XmlSerializer serializer = new XmlSerializer(typeof(T));
  178. //暂时没做什么处理,以后有日志文件,就直接添加进入
  179. serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
  180. serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
  181. model = (T)serializer.Deserialize(newstream);
  182. }
  183. else
  184. {
  185. System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = null;
  186. bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
  187. model = (T)bf.Deserialize(newstream);
  188. }
  189. }
  190. return model;
  191. }
  192.  
  193. #region 反序列化中出错的问题
  194. private void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
  195. {
  196. string aaaa = "Unknown Node:" + e.Name + "\t" + e.Text;
  197. string bb = string.Empty;
  198. }
  199.  
  200. private void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
  201. {
  202. System.Xml.XmlAttribute attr = e.Attr;
  203. string aaaa = "Unknown attribute " + attr.Name + "='" + attr.Value + "'";
  204. string bb = string.Empty;
  205. }
  206. #endregion
  207.  
  208. #endregion
  209. }
  210. }
  1. /// <summary>
  2. /// DataGrid数据的序列化
  3. /// </summary>
  4. /// <typeparam name="T"></typeparam>
  5. /// <param name="obj"></param>
  6. /// <returns></returns>
  7. public static string GetDataGridJson<T>(T obj, int total)
  8. {
  9. StringBuilder strJson = new StringBuilder();
  10.  
  11. if (obj != null)
  12. {
  13. DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
  14. using (MemoryStream stream = new MemoryStream())
  15. {
  16. json.WriteObject(stream, obj);
  17. strJson.Append("{ ");
  18. strJson.Append("\"rows\":");
  19. strJson.Append(Encoding.UTF8.GetString(stream.ToArray(), , stream.ToArray().Length));
  20. strJson.Append(",");
  21.  
  22. strJson.Append("\"total\":");
  23. strJson.Append(total);
  24. strJson.Append("}");
  25. }
  26. return strJson.ToString();
  27. }
  28. else
  29. {
  30. return "{ \"rows\":[],\"total\":0}";
  31. }
  32. }
  33.  
  34. /// <summary>
  35. /// 将json字符串转成list对象
  36. /// </summary>
  37. /// <param name="JsonStr">json串</param>
  38. /// <returns></returns>
  39. public static List<T> JSONStringToList<T>(string JsonStr)
  40. {
  41. JavaScriptSerializer Serializer = new JavaScriptSerializer();
  42. List<T> objs = Serializer.Deserialize<List<T>>(JsonStr);
  43. return objs;
  44. }

调用方式:

//序列化 转换数据至JSON格式 
string strData = JsonHelper.GetJson<List<string>>(listLHCode);//包括List对象集合 <List<T_Users>>

//反序列化

List<T_Users> dataList = JsonHelper.ParseFromJson<List<T_Users>>(sRtdData);

//未知对象转JSON格式

string strData = JsonHelper.GetUnknownJson(new { Channel = Channel, IP = IP })

引用:

首先添加System.Runtime.Serialization的引用

  1. /*对象转json字符(Kafka)*/
  2. var args = new Dictionary<string, string> { { "datas", JsonHelper.GetJson<List<WaterRealTimeData>>(listRealData) }
  3. , { "username", "cn" }
  4. , { "password", "cn" }
  5. };
  6. var jsonString = JsonConvert.SerializeObject(args, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

JSON格式序列化与反序列化(List、XML)的更多相关文章

  1. Rest中的XML与JSON的序列化与反序列化

    #region 获取XML的序列化和反序列化 /// <summary> /// 对象进行序列化生成XML /// </summary> /// <typeparam n ...

  2. [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化

    [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...

  3. golang数据传输格式-序列化与反序列化

    golang数据传输格式-序列化与反序列化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机专业毕业的小伙伴应该都知道数据想要持久化存储,必须将其存在I/O设备里面,这些I ...

  4. C#中的Json的序列化和反序列化

    Json是一种通用的数据格式,我们在数据交换的时候,经常会用到,下面介绍c#中的json序列化和反序列化,当然也可用在asp.net,silverlight,wpf中.我们在下面实例讲解如何进行Jso ...

  5. Newtonsoft.Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

  6. Asp.net中Json的序列化和反序列化(一)

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  7. ASP.NET中JSON的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介 ...

  8. ASP.NET 中JSON 的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  9. 【转】Newtonsoft.Json 的序列化与反序列化

    http://www.cnblogs.com/08shiyan/p/3464028.html 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Fr ...

随机推荐

  1. liunx关闭防火墙

    Redirecting to /bin/systemctl stop iptables.service systemctl stop iptables.service ?????? centos从7开 ...

  2. [LeetCode] Linked List Random Node 链表随机节点

    Given a singly linked list, return a random node's value from the linked list. Each node must have t ...

  3. [LeetCode] Minimum Size Subarray Sum 最短子数组之和

    Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...

  4. vue 2.0 开发实践总结之疑难篇

    续上一篇文章:vue2.0 开发实践总结之入门篇 ,如果没有看过的可以移步看一下. 本篇文章目录如下: 1.  vue 组件的说明和使用 2.  vuex在实际开发中的使用 3.  开发实践总结 1. ...

  5. STL sort 函数实现详解

    作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...

  6. C#中的WebBrowser控件的使用

    0.常用方法   Navigate(string urlString):浏览urlString表示的网址 Navigate(System.Uri url):浏览url表示的网址 Navigate(st ...

  7. tomcat启动报错: org.apache.catalina.deploy.WebXml addFilter

    解决方法为:在Tomacat7的context.xml文件里的<Context>中加上<Loader delegate="true" />

  8. 二叉排序树(BST)创建,删除,查找操作

    binary search tree,中文翻译为二叉搜索树.二叉查找树或者二叉排序树.简称为BST 一:二叉搜索树的定义 他的定义与树的定义是类似的,也是一个递归的定义: 1.要么是一棵空树 2.如果 ...

  9. 用Redis实现分布式锁

    Redis有一系列的命令,特点是以NX结尾,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET if Not eXists.这系列的命令非常有用,这里讲使用SETNX来实现分布式锁 ...

  10. Python_猜大小

    # 需要在python3上执行 import random def game (capital = 1000): point1 = random.randrange(1,7) point2 = ran ...