提问者:小点点

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


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

在其中一个API中,客户端希望我们以yyyy-MM-dd格式公开日期。我不想为此更改全局设置(例如,GlobalConfiguration.Configuration.Formatters.JsonFormatter),因为它非常特定于此客户端。我在为多个客户开发的解决方案中做到了这一点。

我能想到的一个解决方案是创建一个自定义的JsonConverter,然后将其放入我需要进行自定义格式化的属性中

例如。

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

只是想知道是否还有其他简单的方法。


共3个答案

匿名用户

你在正确的轨道上。既然您说不能修改全局设置,那么下一个最好的办法就是根据需要应用< 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[] 参数。