一、
public static string JsonSerializer<T>(T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return jsonString;
}
public static T JsonDeserialize<T>(string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}
示例:
string jsonString = "[{"Key":"USD","Value":"美元"},{"Key":"GBP","Value":"英镑"},{"Key":"EUR","Value":"欧元"}]"; DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Dictionary<string, string>)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); Dictionary<string, string> jsonDic = (Dictionary<string, string>)ser.ReadObject(ms); foreach (var item in jsonDic) { Console.WriteLine("Key:{0}, Value:{1}", item.Key, item.Value); }
注:
1. 必须使用Framework4.0,
2. 引用:
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
二、.net 自带反序列化:只针对一个对象,而不能是数组(如:Dictionary<string, string>)
添加程序集:System.Web.Extensions
using System.Web.Script.Serialization;
public static T JsonDeserializeNet<T>(string jsonString)
{
JavaScriptSerializer ser = new JavaScriptSerializer();
return ser.Deserialize<T>(jsonString);
}
public static string JsonSerializeNet<T>(T t)
{
JavaScriptSerializer ser = new JavaScriptSerializer();
return ser.Serialize(t);
}
要对这三种方式分别作测试,必须要将相应的内库引用进来
(1)JavaScriptSerializer这个类是.Net内置的,属于System.Web.Script.Serialization这个命名空间下面。需要引用System.Web.Extensions这个dll。
(2)DataContract方式也是.net内置的,主要使用的DataContractJsonSerializer这个类,属于System.Runtime.Serialization.Json这个命名空间。需要引用System.Runtime.Serialization这个dll。
(3)Newtonsoft.Json是第三方的dll,但是Visual Studio 对它做了很好的支持。使用方式有两种:一种是去网上下载最新的dll,然后添加引用即可;第二种是直接使用NuGet安装这个包。方式如下:
测试总结:
(1)总的来说,DataContract和Newtonsoft.Json这两种方式效率差别不大,随着数量的增加JavaScriptSerializer的效率相对来说会低些。
(2)对于DataTable的序列化,如果要使用json数据通信,使用Newtonsoft.Json更合适,如果是用xml做持久化,使用DataContract合适。
(3)随着数量的增加JavaScriptSerializer序列化效率越来越低,反序列化和其他两种相差不大。
(4)后来发现当对象的DataTime类型属性不赋值时,DataContract和JavaScriptSerializer这两种方式序列化都会报错,而用Newtonsoft.Json方式可以正常序列化。所以看来在容错方便,还是Newtonsoft.Json比较强。