JavaScriptSerializer名称空间:
using System.Web.Script.Serialization
不需要再手动添加引用
不支持序列化Dictionary类型
DataContractJsonSerializer
名称空间:
using System.Runtime.Serialization.Json
需要手动添加引用 System.Runtime.Serialization;
支持序列化Dictionary类型;
这两个类型都是.NET自带的,今天被它坑的地方是它在序列化DateTime类型的时候会把一个DateTime数据类型的值序列化为Date(286769410010)
的字符串,然后在反序列化的时候会把这个字符串序列化为UTC的标准时间,于是我们这种在东八区的时间,在序列化和反序列化之后就会少掉8个小时,你说坑不坑?!!!
其实,也是有解决方案的,就是在反序列化的时候指定时间类型为Local就好了,代码如下
JavaScriptSerializer myJson = new JavaScriptSerializer();
DateTime myDate = DateTime.Now; //当前时间是2016-08-31 21:52:00
var strSerialized = myJson.Serialize(myDate);//序列化后的字符串是"\\\\/Date(1472651580499)\\\\/"
var strSerialized2 = JsonConvert.SerializeObject(myDate);//使用Json.net序列化后的字符串是"2016-08-31T21:53:00.4997647+08:00"
DateTime myDateDes = myJson.Deserialize<DateTime>(strSerialized);//反序列后就变成UTC时间了,会少掉8个小时
DateTime myDateDes1 = myJson.Deserialize<DateTime>(strSerialized).ToLocalTime();//加上ToLocalTime就是当地时间,即正确的时间
DateTime myDateDes2 = JsonConvert.DeserializeObject<DateTime>(strSerialized2);//使用Json.net反序列化后也是正确的时间,不需要考虑时区的问题
参考:
JavaScriptSerializer UTC DateTime issues
.net DateTime Serialization Deserialization bug
how to get Json.net serialize DateTime similar to JavaScriptSerializer?
为了这两坑爹货,我今天还委屈得跑厕所哭了半小时,这么大人了,有些丢脸,不过确实是累了,压力有点儿大,无论是工作,还是论文……
我真的不是害怕担责任,只是有些时候有些事情确实不是我能把空的,我想做好它,可是时间不允许……