JSON格式序列化与反序列化(List、XML)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Xml.Serialization;
using System.Web.Script.Serialization; namespace Common
{
public class JsonHelper
{
/// <summary>
/// 序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string GetJson<T>(T obj)
{
if (obj == null) return null;
DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
using (MemoryStream stream = new MemoryStream())
{
json.WriteObject(stream, obj);
return Encoding.UTF8.GetString(stream.ToArray(), , stream.ToArray().Length);
}
} /// <summary>
/// 反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="szJson"></param>
/// <returns></returns>
public static T ParseFromJson<T>(string szJson)
{
if (string.IsNullOrEmpty(szJson))
return default(T);
//xml内容乱码可正确转换 using (var ms = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(szJson), XmlDictionaryReaderQuotas.Max))
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
{
var serializer = new DataContractJsonSerializer(typeof(T));
return (T)serializer.ReadObject(ms);
}
} /// <summary>
/// 对未知或匿名对象进行Json序列化。
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string GetUnknownJson(object value)
{
if (value == null) return null;
return new JavaScriptSerializer().Serialize(value);
}
/// <summary>
/// DataContractJson序列化,用于序列化里面附带未知类型的实体。
/// </summary>
/// <param name="value"></param>
/// <param name="knownTypes">知道类型</param>
/// <returns></returns>
public static string GetJson(object value, IEnumerable<Type> knownTypes)
{
if (value == null) return null;
using (var ms = new MemoryStream())
{
new DataContractJsonSerializer(value.GetType(), knownTypes).WriteObject(ms, value);
return Encoding.UTF8.GetString(ms.ToArray());
}
} #region 序列化文件和反序列化 /// <summary>
/// 通用类的保存函数,可以将已经声明过可序列化的类以文件方式保存起来。
/// 保存格式分为 XML明文式和 二进制。
/// 如果目标目录不存在,就自动创建目录。
/// </summary>
/// <typeparam name="T">要保存的类的类型</typeparam>
/// <param name="tclass">要保存的类</param>
/// <param name="sFilePath">要保存的文件完整路径,包括文件名。</param>
/// <param name="bXmlOrBin">true=XML,false=Bin</param>
/// <exception cref="System.Exception"></exception>
public void Save<T>(T tclass, string sFilePath, bool bXmlOrBin)
{
//目录检查
string sFolder = sFilePath.Substring(, sFilePath.LastIndexOf("\\"));
if (!Directory.Exists(sFolder)) Directory.CreateDirectory(sFolder); using (FileStream fs = new FileStream(sFilePath, FileMode.Create, FileAccess.Write))
{
if (bXmlOrBin)
{
using (MemoryStream stream = Serialize<T>(tclass, bXmlOrBin))
{
stream.WriteTo(fs);
stream.Close();
}
}
else
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = null;
bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
bf.Serialize(fs, bXmlOrBin);
}
fs.Close();
}
} /// <summary>
/// 从文件加载保存的信息,然后反序列化并返回保存的信息。
/// 如果要读取的文件不存在会引发异常。
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="tclass">要返回的类,失败返回默认</param>
/// <param name="sFilePath">文件路径</param>
/// <param name="bXmlOrBin">true=XML,false=Bin</param>
/// <exception cref="System.Exception"></exception>
/// <exception cref="System.IO.IOException">文件不存在</exception>
public void Load<T>(out T tclass, string sFilePath, bool bXmlOrBin)
{
if (!File.Exists(sFilePath))
{
tclass = default(T);
return;
//throw new IOException("要访问的文件不存在。");
}
using (FileStream fs = new FileStream(sFilePath, FileMode.Open, FileAccess.Read))
{
tclass = Deserialize<T>(fs, bXmlOrBin);
fs.Close();
}
} /// <summary>
/// 将传入的某个模型序列化,并返回其数据量,用于保存到文件里面。
/// 提供序列化到XML或二进制。
/// </summary>
/// <typeparam name="T">类的类型</typeparam>
/// <param name="model">要序列化的模型</param>
/// <param name="bXmlOrBin">true=xml序列化,false=二进制序列化</param>
/// <returns></returns>
/// <exception cref="System.Exception"></exception>
public MemoryStream Serialize<T>(T model, bool bXmlOrBin = true)
{
MemoryStream stream = new MemoryStream();
if (bXmlOrBin)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Serialize(stream, model);
}
else
{
var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
bf.Serialize(stream, model);
}
stream.Position = ;
return stream;
} /// <summary>
/// 将传入的数据量进行反序列化。
/// </summary>
/// <typeparam name="T">类的类型</typeparam>
/// <param name="stream">要反序列化的流</param>
/// <param name="bXmlOrBin">true=xml序列化,false=二进制序列化</param>
/// <returns></returns>
public T Deserialize<T>(Stream stream, bool bXmlOrBin = true)
{
T model = default(T);
using (var newstream = stream)
{
if (bXmlOrBin)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
//暂时没做什么处理,以后有日志文件,就直接添加进入
serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
model = (T)serializer.Deserialize(newstream);
}
else
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = null;
bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
model = (T)bf.Deserialize(newstream);
}
}
return model;
} #region 反序列化中出错的问题
private void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
{
string aaaa = "Unknown Node:" + e.Name + "\t" + e.Text;
string bb = string.Empty;
} private void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
{
System.Xml.XmlAttribute attr = e.Attr;
string aaaa = "Unknown attribute " + attr.Name + "='" + attr.Value + "'";
string bb = string.Empty;
}
#endregion #endregion
}
}
/// <summary>
/// DataGrid数据的序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string GetDataGridJson<T>(T obj, int total)
{
StringBuilder strJson = new StringBuilder(); if (obj != null)
{
DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
using (MemoryStream stream = new MemoryStream())
{
json.WriteObject(stream, obj);
strJson.Append("{ ");
strJson.Append("\"rows\":");
strJson.Append(Encoding.UTF8.GetString(stream.ToArray(), , stream.ToArray().Length));
strJson.Append(","); strJson.Append("\"total\":");
strJson.Append(total);
strJson.Append("}");
}
return strJson.ToString();
}
else
{
return "{ \"rows\":[],\"total\":0}";
}
} /// <summary>
/// 将json字符串转成list对象
/// </summary>
/// <param name="JsonStr">json串</param>
/// <returns></returns>
public static List<T> JSONStringToList<T>(string JsonStr)
{
JavaScriptSerializer Serializer = new JavaScriptSerializer();
List<T> objs = Serializer.Deserialize<List<T>>(JsonStr);
return objs;
}
调用方式:
//序列化 转换数据至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的引用

/*对象转json字符(Kafka)*/
var args = new Dictionary<string, string> { { "datas", JsonHelper.GetJson<List<WaterRealTimeData>>(listRealData) }
, { "username", "cn" }
, { "password", "cn" }
};
var jsonString = JsonConvert.SerializeObject(args, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
JSON格式序列化与反序列化(List、XML)的更多相关文章
- Rest中的XML与JSON的序列化与反序列化
#region 获取XML的序列化和反序列化 /// <summary> /// 对象进行序列化生成XML /// </summary> /// <typeparam n ...
- [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...
- golang数据传输格式-序列化与反序列化
golang数据传输格式-序列化与反序列化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机专业毕业的小伙伴应该都知道数据想要持久化存储,必须将其存在I/O设备里面,这些I ...
- C#中的Json的序列化和反序列化
Json是一种通用的数据格式,我们在数据交换的时候,经常会用到,下面介绍c#中的json序列化和反序列化,当然也可用在asp.net,silverlight,wpf中.我们在下面实例讲解如何进行Jso ...
- Newtonsoft.Json 的序列化与反序列化
首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...
- Asp.net中Json的序列化和反序列化(一)
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- ASP.NET中JSON的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介 ...
- ASP.NET 中JSON 的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- 【转】Newtonsoft.Json 的序列化与反序列化
http://www.cnblogs.com/08shiyan/p/3464028.html 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Fr ...
随机推荐
- redis键命令
1.ping命令用于检测redis是否启动 成功返回pong表示链接成功 2.在远程redis服务上执行命令 Redis-cli -h host -p port -a password 如果是连接本机 ...
- 如何查看当前Ubuntu系统的版本
如何查看当前Ubuntu系统的版本 说来也惭愧,用Ubuntu差不多快1个月了,双系统是让朋友安的,只知道自己使用的是什么12版本的,具体怎么看还不知道,下面写一下查看当前Linux系统的版本的方法 ...
- 类EF框架Chloe.ORM升级:只为更完美
扯淡 Chloe.ORM:一款轻量.高效的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq(但不支持 Linq).借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接 ...
- 在ASP.NET Core中使用Angular2,以及与Angular2的Token base身份认证
注:下载本文提到的完整代码示例请访问:How to authorization Angular 2 app with asp.net core web api 在ASP.NET Core中使用Angu ...
- c#连接关闭了,事务并没有关闭
用的是mysql引擎是InnoDB,用到了连接池. 连接还没关闭,但是事务开启,并执行了更新id=14的操作,这是把这一行锁住了,可以查询,但不能更新和删除,必需等锁释放,提交换回滚事务时锁被释放.直 ...
- Zend Framework 1 - Quick Start
创建 Zend 项目 要创建 Zend 项目,首先要下载并解压 Zend Framework. 安装 Zend Framework 下载最新的 Zend Framework 1.12.20 源码包,( ...
- asp.net mvc 绑定客户端post过来的复杂JSON数据
客户端代码如下: <input type="button" id="btnTest" value="测试" /><br / ...
- poj3581
Sequence Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 6893 Accepted: 1534 Case Tim ...
- 史上最详细的linux网卡ifcfg-eth0配置详解
通过查资料与工作中的进行一下总结: DEVICE="eth1" 网卡名称NM_CONTROLLED="yes" network mamager的参 ...
- 【翻译】如何在AJAX生成的内容中再次运行Prism.js
一.前言 最近用一个十分轻量级的网页代码高亮Js库,应用到项目中发现了一个问题,对于静态的已经写好的代码,Prism的高亮插件是没有问题的,但是通过Ajax异步获取数据并修改DOM时发现,Prism高 ...