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