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

时间: 2024-08-01 08:41:36

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

Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称

手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数据,经过分析一个简单的列表接口每一行数据返回了16个字段,但是手机APP端只用到了其中7个字段,剩余9个字段的数据全部都是多余的,如果接口返回数据为40K大小,也就是说大约20K的数据为无效数据,3G网络下20K下载差不多需要1s,不返回无效数据至少可以节约1s的时间,大大提高用户体验.本篇将为大家

Newtonsoft.Json 时间格式化问题

1.WPF加载时进行全局设置 Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings(); JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() => { setting.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.M

Newtonsoft.Json 序列化和反序列化 时间格式【转】

1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg: A a=new A(); a.Name="Elain00"; a.Hobby="eat eat"; string jsonStr=JsonConvert.SerializeObject(a); 2.JSON反序列化 string jsonstr = "jsonString";Class model = JsonCo

Newtonsoft.Json 序列化和反序列化 时间格式

1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg: A a=new A(); a.Name="Elain00"; a.Hobby="eat eat"; string jsonStr=JsonConvert.SerializeObject(a); 2.JSON反序列化 string jsonstr = "jsonString";Class model = JsonCo

Newtonsoft.Json在转换指定时间格式时默认是UTC时间

最近做项目发现前台传入时间格式是/Date(1542893033449)/的时候,后台用Newtonsoft.Json发现竟然转换成了UTC时间,查阅了Newtonsoft.Json文档,发现如果需要转换成本地时区的时间需要按照以下写法 public void SetDate(string piple) { var x = new JsonSerializerSettings(); x.DateTimeZoneHandling = DateTimeZoneHandling.Local; var

Newtonsoft.Json高级用法

手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数据,经过分析一个简单的列表接口每一行数据返回了16个字段,但是手机APP端只用到了其中7个字段,剩余9个字段的数据全部都是多余的,如果接口返回数据为40K大小,也就是说大约20K的数据为无效数据,3G网络下20K下载差不多需要1s,不返回无效数据至少可以节约1s的时间,大大提高用户体验.本篇将为大家

[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) JSON序列化利器 Newtonsoft.Json 及 通用Json类

[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) JSON序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能不了解Json.net(Newtonsoft.Json)这款世界级的开源类库,除了拥有良好的性能之外,功能也是非常强大的. 本节会详细说明这个类库.此外,对于不喜欢使用第三方类库的同学,会整理一个基于微软类库的通用Json类. 读前必备: 本节主要介绍一款第三方类库和一个自己整理封装的类库,说起到封装

C#.NET序列化XML、JSON、二进制微软自带DLL与newtonsoft(json.net)

序列化是将对象转换成另一种格式(XML.json.二进制byte[]) JSON序列化 .NET中有三种常用的JSON序列化的类,分别是: Newtonsoft.Json.JsonConvert类(推荐) Newtonsoft.Json.JsonConvert类是非微软提供的一个JSON序列化和反序列的开源免费的类库(下载网址是:http://www.codeplex.com/json/),它提供了更灵活的序列化和反序列化控制,并且如果你的开发环境使用的是.NET Framework3.5及以后

Newtonsoft.Json高级用法--转载至 焰尾迭 随笔

本人只做搬运工,以这方便自己学习的态度!以下内容均为拷贝! 如有不适请联系本人! 本文原作者:焰尾迭 本文地址:http://www.cnblogs.com/yanweidie/p/4605212.html#commentform 手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数据,经过分析一个简单的列表接口每一行数据返回了16个字段,但是手机A