zoukankan      html  css  js  c++  java
  • asp.net webapi Datetime 序列化反序列化为时间戳

    项目需求原因需要把Webapi中的Datetime 序列化及反序列化时间戳(long),遇到相同问题的同学可作参考。

    1.声明一个时间戳转换器

     1     public class UnixDateTimeConvertor : DateTimeConverterBase
     2     {
     3 
     4         public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
     5         {
     6             long jsTimeStamp = long.Parse(reader.Value.ToString());
     7             System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
     8             DateTime dt = startTime.AddMilliseconds(jsTimeStamp);
     9             return dt;
    10         }
    11 
    12         public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    13         {
    14             System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); 
    15             long timeStamp = (long)(((DateTime)value) - startTime).TotalMilliseconds; 
    16             writer.WriteValue(timeStamp);
    17         }
    18     }

    2.配置使用时间戳转换器(到这一步API就能序列化和反序列化时间戳了)

     1     public static class WebApiConfig
     2     {
     3         public static void Register(HttpConfiguration config)
     4         {
     5             //启用标记路由功能
     6             config.MapHttpAttributeRoutes();
     7 
     8             config.Routes.MapHttpRoute(
     9                 name: "DefaultApi",
    10                 routeTemplate: "api/{controller}/{id}",
    11                 defaults: new { id = RouteParameter.Optional }
    12             );
    13 
    15             //设置Datetime 到 時間戳 的互轉 
    16             JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings()
    17             {
    18                 Formatting = Formatting.Indented,
    19                 DateTimeZoneHandling = DateTimeZoneHandling.Local
    20             };
    21             jSettings.Converters.Add(new UnixDateTimeConvertor());
    22             config.Formatters.JsonFormatter.SerializerSettings = jSettings;
    23 
    24         }
    25     }

    3.因为项目中使用了Swagger UI自动生成WebApi文档如果想接口文档Datetime显示的Example是时间戳可以如以下设置,在你自己的SwaggerConfig设置中添加Datetime及Datetime?的映射和默认值

     1             config
     2                 .EnableSwagger(c =>
     3                     {
     4             //...省略无关代码
     5 
     6                         System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); 
     7                         long exampleVal = (long)(DateTime.Now - startTime).TotalMilliseconds; 
     8                         Schema timeSchema = new Schema { type = "number", format = "long", example = exampleVal };
     9 
    10                         c.MapType<DateTime?>(() => timeSchema);
    11                         c.MapType<DateTime>(() => timeSchema);
    12 
    13                     });

    最终生成的Webapi文档显示如下

  • 相关阅读:
    TableDriven method code complete reading notes
    Fundamental data type Code complete reading notes(12)
    利用消息机制实现.NET AOP(面向方面编程)--利用RealProxy和消息接收器实现多截获
    Organizing straightline code Code complete reading notes(14)
    Statements Code complete reading notes
    The softwarequanlity landscape Code complete reading notes
    支持ViewState和ControlState压缩的页面基类(ASP.NET2.0)
    XPath遇上命名空间
    怎样让WinForms下DataGrid可以像ASP.NET下的DataGrid一样使用自定义的模板列
    检验密码强度的JS类
  • 原文地址:https://www.cnblogs.com/nekoyzx/p/6831222.html
Copyright © 2011-2022 走看看