使用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也可用。