Newtonsoft.Json中的时间格式详解.
Newtonsoft.json是一款不错的序列化反序列化第三方组件,具体如何使用属于基础知识,此处不再讲解.看以下代码: public class OutgameEntity { string orderid{get;set;} public DateTime? payTime { get; set; } } 很简单的一个实体类 假如此时有一个url:http://www.xxx.xx/do.svc/xxx?data=,我们如果要把OutgameEntity实体类的值传过去,就需要反序列化对象为string字符串. static string JsonSerialize(T o) { string str = JsonConvert.SerializeObject(o,Newtonsoft.Json.Formatting.Indented,new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); return str; } new WebClient().DownloadString(url,JsonSerialize(OutgameEntity)); 此段代码看似没有任何问题.不过当你接收时,你会发现一点点问题. "payTime":"/Date(13884569650000800)/". 如果这个参数值没有任何意义,那么我们可以忽略这个问题.但是作为程序员,特别是和别的公司进行对接的接口会出现这样的参数值,会给同行造成此人是菜鸟的心理.所以我们应该想办法解决这个不大不小的问题. 如何解决呢? 请看以下这个接口: using Newtonsoft.Json.Schema; using System; namespace Newtonsoft.Json { abstract class JsonConverter { protected JsonConverter(); virtual bool CanRead { get; } bool CanWrite { get; } bool CanConvert(Type objectType); virtual JsonSchema GetSchema(); object ReadJson(JsonReader reader,Type objectType,255)">object existingValue,JsonSerializer serializer); void WriteJson(JsonWriter writer,255)">object value,JsonSerializer serializer); } } using Newtonsoft.Json; namespace Newtonsoft.Json.Converters { class DateTimeConverterBase : JsonConverter { protected DateTimeConverterBase(); override bool CanConvert(Type objectType); } } 已经有了DatetimeConverterBse这个父类,那么要实现这个功能就比较好办. 我们去重写实现JsonConverter中的ReadJson和WriteJson方法,如下: class UnixDateTimeConverter : DateTimeConverterBase { if (reader.TokenType != JsonToken.Integer) { throw new Exception(String.Format("日期格式错误,got {0}.",reader.TokenType)); } var ticks = (long)reader.Value; var date = new DateTime(1970,1,1); date = date.AddSeconds(ticks); return date; } long ticks; if (value is DateTime) { var epoc = value) - epoc; if (delta.TotalSeconds < 0) { new ArgumentOutOfRangeException("时间格式错误.1"); } ticks = (long)delta.TotalSeconds; } else { new Exception("时间格式错误.2"); } writer.WriteValue(ticks); } } 请注意JsonConverter类中有一个方法叫CanConvert(Type t),那由此我们是否可以用这样的方式来实现呢?如代码所示: class ModelEntity { string value { get; set; } [JsonConverter(typeof(UnixDateTimeConverter))] public DateTime createtime { get; set; } } OK,debug走起, private void button1_Click(object sender,EventArgs e) { var model = new ModelEntity(); model.birthdate = DateTime.Now; model.value = "Find a Way"; var str = Common.SerializerHelper<ModelEntity>.JsonSerialize(model); }
那我修改实体,如下:
再去反序列化呢?
时间戳,高大尚,妈妈再也不用担心我写代码. 上面的一大堆,简单的实现的话就下面的一段就可以了:
用Newtonsoft.Json转换json,可是如果数据库是日期类型转换出来之后变成了"/Date(1269582661683+0800)/"这样的格式
下面是解决方案: List<UserInfo> listUser = UserInfoManage.GetUserInfoBySQL("Select Top 5 * From Userinfo");
[{ "Id": 6,"UserId": "food6","UserPwd": "f0000","State": true,"RegTime": "2009-10-16 16:59:59","ComeInt": 1,"RegAdmin": "1","IsVip": 0,"IsPhoneSale": 0,"IsA": 0,"IsB": 0,"A": "","B": "","C": "" }] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |