Newtonsoft.json是一款不错的序列化反序列化第三方组件,具体如何使用属于基础知识,此处不再讲解.看以下代码:

public class OutgameEntity
{
public string orderid{get;set;}
public DateTime? payTime { get; set; }
}.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

很简单的一个实体类

假如此时有一个url:http://www.xxx.xx/do.svc/xxx?data=,我们如果要把OutgameEntity实体类的值传过去,就需要反序列化对象为string字符串.

public 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)\/".
如果这个参数值没有任何意义,那么我们可以忽略这个问题.但是作为程序员,特别是和别的公司进行对接的接口会出现这样的参数值,会给同行造成此人是菜鸟的心理.所以我们应该想办法解决这个不大不小的问题.
如何解决呢?
 

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

请看以下这个接口:
using Newtonsoft.Json.Schema;
using System; namespace Newtonsoft.Json
{
public abstract class JsonConverter
{
protected JsonConverter(); public virtual bool CanRead { get; }
public virtual bool CanWrite { get; } public abstract bool CanConvert(Type objectType);
public virtual JsonSchema GetSchema();
public abstract object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer);
public abstract void WriteJson(JsonWriter writer, object value, JsonSerializer serializer);
}
}
using Newtonsoft.Json;
using System; namespace Newtonsoft.Json.Converters
{
public abstract class DateTimeConverterBase : JsonConverter
{
protected DateTimeConverterBase(); public override bool CanConvert(Type objectType);
}
}

已经有了DatetimeConverterBse这个父类,那么要实现这个功能就比较好办.

我们去重写实现JsonConverter中的ReadJson和WriteJson方法,如下:

public class UnixDateTimeConverter : DateTimeConverterBase
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
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;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
long ticks;
if (value is DateTime)
{
var epoc = new DateTime(1970, 1, 1);
var delta = ((DateTime)value) - epoc;
if (delta.TotalSeconds < 0)
{
throw new ArgumentOutOfRangeException("时间格式错误.1");
}
ticks = (long)delta.TotalSeconds;
}
else
{
throw new Exception("时间格式错误.2");
}
writer.WriteValue(ticks);
}
}

请注意JsonConverter类中有一个方法叫CanConvert(Type t),那由此我们是否可以用这样的方式来实现呢?如代码所示:

public class ModelEntity
{
public 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);
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

那我修改实体,如下:

再去反序列化呢?

时间戳,高大尚,妈妈再也不用担心我写代码.

Newtonsoft.Json中的时间格式详解.的更多相关文章

  1. [转] Node.js中package.json中库的版本号详解(^和~区别)

    当我们查看package.json中已安装的库的时候,会发现他们的版本号之前都会加一个符号,有的是插入符号(^),有的是波浪符号(~).那么他们到底有什么区别呢?先贴一个例子,对照例子来做解释: bl ...

  2. Node.js中package.json中库的版本号详解(^和~区别)

    当我们查看package.json中已安装的库的时候,会发现他们的版本号之前都会加一个符号,有的是插入符号(^),有的是波浪符号(~).那么他们到底有什么区别呢?先贴一个例子,对照例子来做解释: &q ...

  3. binlog之四:mysql中binlog_format模式与配置详解,binlog的日志格式详解

    mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复 ...

  4. js json中的时间转换格式

    //根据json中的日期格式,转换成yyyy-mm-dd HH:mm:ss function ChangeDateFormat(cellval) { var date = new Date(parse ...

  5. Asp.net中web.config配置文件详解(一)

    本文摘自Asp.net中web.config配置文件详解 web.config是一个XML文件,用来储存Asp.NET Web应用程序的配置信息,包括数据库连接字符.身份安全验证等,可以出现在Asp. ...

  6. [转帖]ECC公钥格式详解

    ECC公钥格式详解 https://www.cnblogs.com/xinzhao/p/8963724.html 本文首先介绍公钥格式相关的若干概念/技术,随后以示例的方式剖析DER格式的ECC公钥, ...

  7. java分享第十五天(log4j 格式详解)

    log4j 格式详解  log4j.rootLogger=日志级别,appender1, appender2, -. 日志级别:ALL<DEBUG<INFO<WARN<ERRO ...

  8. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  9. Android中Service的使用详解和注意点(LocalService)

    Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...

随机推荐

  1. flask-admin章节四:flask session的使用

    1. 关于session flask session可能很多人根本都没有使用过,倒是cookie大家可能使用得比较多.flask cookie使用起来比较简单,就两个函数,读取和设置. 具体使用方式如 ...

  2. iOS所有的子视图

    for (id view in [self.view subviews]) { if ([view isEqual:[UITextField class]]) { NSLog(@"你想要?& ...

  3. if语句

    Python是一门用于编程的语言,所以必要的判断是一定有的,本章介绍的就是Python的判断语句if判断. 因为Python在一句代码结束的时候没有符号来明确的标记,这就造成了Python的if语句和 ...

  4. [erlang]supervisor(监控树)的重启策略

    1. init函数 init() -> {ok, {SupFlags, [ChildSpec,...]}} | ignore. [ChildSpec,...] 是在init之后默认要启动的子进程 ...

  5. eclipse在光标停留在同一对象的背景色提示,开启与关闭

    eclipse在光标停留在变量上的时候,同一变量能够提示相同的背景色.这个功能感觉不起眼,但是实在是很好用啊.如果不小心点消失了会很麻烦. 这里留个记录,如果关闭了记得开启: 开启关闭的位置在工具栏上 ...

  6. js判断字符串中是否含有指定汉语

    核心代码: function haveChinese(str,c){ if(escape(str).indexOf(escape(c))!=-1){ retrun true; } return fal ...

  7. hibernate配置文件中的schema="dbo"在MySQL数据库不可用

    把项目的数据库由SQL Server更改为MySQL之后,发现hibernate报错. 问题在于schema="dbo",使用SQL Sever数据库时正常,使用MySQL数据库需 ...

  8. python第一天基础1-2

    python入门 1 第一个python代码: 在linux上创建第一个.py脚本 #!/usr/bin/env python #-*- coding:utf-8 -*- print "He ...

  9. weblogic网页登录URL

    http://172.16.64.173:7001/console/login/LoginForm.jsp

  10. Oracle中rownum和rowid的理解(转)

    本文转自地址http://www.linuxidc.com/Linux/2012-04/58300.htm rownum,rowid都叫伪列. 但是,rownum是逻辑上的编号,且其值总是从1开始,每 ...