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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

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

在其中一个API中,客户希望我们以yyyy-MM-dd格式公开日期。我不想为此更改全局设置(例如GlobalConfiguration.Configuration.Formatters.JsonFormatter),因为它对此客户端非常具体。而且我在一个针对多个客户的解决方案中进行开发。

我能想到的解决方案之一是创建一个自定义Json转换器,然后把它放到我需要做的自定义格式的属性

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

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

提问于
用户回答回答于

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

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

如果你不介意在那里也有时间,你甚至不需要继承IsoDateTimeConverter。它的默认日期格式是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[]参数的重载。

扫码关注云+社区