我正在开发一个API来使用ASP.NET Web API公开一些数据。
在其中一个API中,客户希望我们以yyyy-MM-dd
格式公开日期。我不想为此更改全局设置(例如GlobalConfiguration.Configuration.Formatters.JsonFormatter
),因为它非常特定于此客户端。我在多个客户的解决方案中进行开发。
我能想到的解决方案之一是创建一个自定义JsonConverter
,然后将其放到我需要进行自定义格式化的属性
EG
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
(如source code中所示)。
你可以使用这种方法:
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
它也可以使用IsoDateTimeConverter
实例完成,而无需更改全局格式设置:
string json = JsonConvert.SerializeObject(yourObject,
new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });
这使用带有JsonConvert.SerializeObject
参数的params JsonConverter[]
重载。
也可以使用其中一个串行器设置重载:
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" });
也可以使用类型超载。
构建帮助程序类并将其应用于属性属性
助手班:
public class ESDateTimeConverter : IsoDateTimeConverter
{
public ESDateTimeConverter()
{
base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffZ";
}
}
您的代码使用如下:
[JsonConverter(typeof(ESDateTimeConverter))]
public DateTime timestamp { get; set; }
有时装饰json convert属性不起作用,它会通过异常说“2010-10-01”是有效日期。为了避免这种类型,我删除了属性上的json convert属性,并在deserilizedObject方法中提到,如下所示。
var addresss = JsonConvert.DeserializeObject<AddressHistory>(address, new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" });
我一直在使用另一种解决方案。只需创建一个字符串属性并将其用于json。此属性将返回日期格式正确。
class JSonModel {
...
[JsonProperty("date")]
public string MyDate { get; set; }
public string CustomDate {
get { return MyDate.ToString("DDMMYY"); }
set { MyDate = DateTime.Parse(value); }
}
...
}
这样您就不必创建额外的类。此外,它允许您创建不同的数据格式。例如,您可以使用相同的DateTime轻松创建另一个小时属性。