使用Json.Net序列化时指定自定义date时间格式

我正在开发一个API来使用ASP.NET Web API公开一些数据。

在其中一个API中,客户希望我们以yyyy-MM-dd格式公开date。 我不想更改全局设置(例如GlobalConfiguration.Configuration.Formatters.JsonFormatter ),因为它是非常特定于此客户端。 而且我也在为多个客户开发解决scheme。

我能想到的解决scheme之一是创build一个自定义的JSON转换器,然后把它的属性,我需要做的自定义格式

例如

 class ReturnObjectA { [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime ReturnDate { get;set;} } 

只是想知道是否有一些其他简单的方法做到这一点。

你在正确的轨道上。 既然你说过你不能修改全局设置,那么下一个最好的事情就是按照你的build议,根据需要应用JsonConverter属性。 原来Json.Net已经有了一个内置的IsoDateTimeConverter ,可以让你指定date格式。 不幸的是,你不能通过JsonConverter属性设置格式,因为属性唯一的参数是一个types。 但是,有一个简单的解决scheme:子类IsoDateTimeConverter ,然后在子类的构造函数中指定date格式。 根据需要应用JsonConverter属性,指定您的自定义转换器,然后就可以开始了。 这是所需的全部代码:

 class CustomDateTimeConverter : IsoDateTimeConverter { public CustomDateTimeConverter() { base.DateTimeFormat = "yyyy-MM-dd"; } } 

如果你不介意在那里有时间,你甚至不需要inheritanceIsoDateTimeConverter。 它的默认date格式是yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK (如源代码所示 )。

它也可以用一个临时的IsoDateTimeConverter实例来完成,而不用改变全局格式设置:

 string json = JsonConvert.SerializeObject(yourObject, new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }); 

这使用了带有params JsonConverter[]参数的重载。

你可以使用这种方法:

 public class DateFormatConverter : IsoDateTimeConverter { public DateFormatConverter(string format) { DateTimeFormat = format; } } 

并以这种方式使用它:

 class ReturnObjectA { [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-dd")] public DateTime ReturnDate { get;set;} } 

也可以使用其中一个序列器设置重载:

 var json = JsonConvert.SerializeObject(someObject, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" }); 

要么

 var json = JsonConvert.SerializeObject(someObject, Formatting.Indented, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" }); 

过载采取types也可用。