Newtonsoft.Json同时对多个时间字段以不同的格式序列化

 

  在博客园潜水多年,学到很多,也进步了很多,在这里说声谢谢,是时候给园友分享一点自己的东西,希望和大家一起进步.

之前有个需求要对一张表的多个时间字段进行不同的格式序列化,

在网上没找到相对较好的解决方案

就自己花了点时间研究了下,封装了下IsoDateTimeConverter这个类得以实现

不多说直接上源码

 1 using Newtonsoft.Json.Converters;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.ComponentModel.DataAnnotations;
 5 
 6 namespace LenovoCW.Library
 7 {
 8     /// <summary>
 9     /// 时间序列化
10     /// </summary>
11     public class DateTimeJson : IsoDateTimeConverter
12     {
13         /// <summary>
14         /// 序列化格式集合
15         /// </summary>
16         public Dictionary<string, string> formatlist = new Dictionary<string, string>();
17 
18         /// <summary>
19         /// 时间序列化
20         /// </summary>
21         /// <param name="type">序列化类型</param>
22         /// <param name="format">默认序列化格式</param>
23         public DateTimeJson(Type type=null,string format = "yyyy-MM-dd HH:mm")
24         {
25             formatlist["default_format"] = format;
26             if (type != null)
27             {
28                 var pro = type.GetProperties();
29                 foreach (var item in pro)
30                 {
31                     var displayformat = Attribute.GetCustomAttribute(item, typeof(DisplayFormatAttribute)) as DisplayFormatAttribute;
32                     if (displayformat != null)
33                     {
34                         formatlist[item.Name] = displayformat.DataFormatString;
35                     }
36                 }
37             }
38         }
39 
40         /// <summary>
41         /// 创建时间序列化对象
42         /// </summary>
43         /// <param name="type">序列化类型</param>
44         /// <param name="format">序列化类型</param>
45         /// <returns>时间序列化对象</returns>
46         public static DateTimeJson Create(Type type = null, string format = "yyyy-MM-dd HH:mm")
47         {
48             return new DateTimeJson(type, format);
49         }
50 
51         /// <summary>
52         /// 创建时间序列化对象
53         /// </summary>
54         /// <typeparam name="model">指定的模型</typeparam>
55         /// <param name="format">序列化类型</param>
56         /// <returns>时间序列化对象</returns>
57         public static DateTimeJson Create<model>(string format = "yyyy-MM-dd HH:mm")
58         {
59             return new DateTimeJson(typeof(model), format);
60         }
61 
62         /// <summary>
63         /// 添加序列化格式
64         /// </summary>
65         /// <param name="name">序列化字段名称</param>
66         /// <param name="format">序列化格式</param>
67         /// <returns>时间序列化</returns>
68         public DateTimeJson Add(string name, string format)
69         {
70             formatlist[name] = format;
71             return this;
72         }
73 
74         /// <summary>
75         /// 写序列化方法
76         /// </summary>
77         /// <param name="writer">写入对象</param>
78         /// <param name="value"></param>
79         /// <param name="serializer">调用序列化对象</param>
80         public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
81         {
82             var name = writer.Path.Split(.)[1];
83             if (formatlist.ContainsKey(name))
84             {
85                 base.DateTimeFormat = formatlist[name];
86             }
87             else
88             {
89                 base.DateTimeFormat = formatlist["default_format"];
90             }
91             base.WriteJson(writer, value, serializer);
92         }
93     }
94 }

 

使用方法

 1 public class User
 2     {
 3         [DisplayFormat(DataFormatString = "yyyy-MM")]
 4         public DateTime addtime { get; set; }
 5         [DisplayFormat(DataFormatString = "yyyy-MM-dd HH:mm")]
 6         public DateTime updtime { get; set; }
 7         [DisplayFormat(DataFormatString = "yyyy-MM-dd")]
 8         public DateTime birthday { get; set; }
 9     }
10 
11 
12 //使用方法一(需要添加DisplayFormat特性)
13 JsonConvert.SerializeObject(userlist, DateTimeJson.Create<User>());
14 
15 //使用方法二(可以不用添加DisplayFormat特性)
16 JsonConvert.SerializeObject(mls, DateTimeJson.Create().Add("addtime", "yyyy-MM").Add("updtime", "yyyy-MM-dd HH:mm").Add("birthday", "yyyy-MM-dd"));

 


最后如果有问题欢迎和我技术交流

QQ: 512 021 512

 

 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。