我正在开发一个API,使用ASP公开一些数据。NET Web API。
在其中一个API中,客户端希望我们以yyyy-MM-dd
格式公开日期。我不想为此更改全局设置(例如,GlobalConfiguration.Configuration.Formatters.JsonFormatter
),因为它非常特定于此客户端。我在为多个客户开发的解决方案中做到了这一点。
我能想到的一个解决方案是创建一个自定义的JsonConverter
,然后将其放入我需要进行自定义格式化的属性中
例如。
class ReturnObjectA
{
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime ReturnDate { get;set;}
}
只是想知道是否还有其他简单的方法。
你在正确的轨道上。既然您说不能修改全局设置,那么下一个最好的办法就是根据需要应用< code>JsonConverter属性,就像您建议的那样。原来Json.Net已经有了一个内置的< code > IsoDateTimeConverter ,可以让你指定日期格式。不幸的是,您不能通过< code>JsonConverter属性设置格式,因为该属性的唯一参数是类型。然而,有一个简单的解决方案:子类化< code > IsoDateTimeConverter ,然后在子类的构造函数中指定日期格式。在需要的地方应用< code>JsonConverter属性,指定您的自定义转换器,然后就可以开始了。以下是所需的全部代码:
class CustomDateTimeConverter : IsoDateTimeConverter
{
public CustomDateTimeConverter()
{
base.DateTimeFormat = "yyyy-MM-dd";
}
}
如果您不介意时间也在其中,您甚至不需要对IsoDateTimeConverter进行子类化。它的默认日期格式是yyyy'-'MM'-'dd'T'HH':'MM':'ss。ffffffk
(如源代码所示)。
您可以使用此方法:
public class DateFormatConverter : IsoDateTimeConverter
{
public DateFormatConverter(string format)
{
DateTimeFormat = format;
}
}
并且这样使用它:
class ReturnObjectA
{
[JsonConverter(typeof(DateFormatConverter), "yyyy-MM-dd")]
public DateTime ReturnDate { get;set;}
}
DateTimeFormat
字符串使用. NET格式字符串语法如下所述:https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
也可以使用< code > iso datetime converter 实例来完成,而无需更改全局格式设置:
string json = JsonConvert.SerializeObject(yourObject,
new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });
这使用 JsonConvert.SerializeObject
重载,该重载采用参数 JsonConverter[]
参数。