返回Dictionary的webAPI方法的结果没有按照IsoDateTimeConverter
中定义的格式序列化这是我的配置:
public static class WebApiConfig
{
//Web API configuration and services
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter
{
DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'"
});
}
}
下面是一个webAPI方法
的示例[Route("GetPlanning")]
[HttpPost]
public Dictionary<DateTime, IEnumerable<int>> GetPlanning()
{
Dictionary<DateTime, IEnumerable<int>> planning = new Dictionary<DateTime,IEnumerable<int>>();
planning.Add(DateTime.UtcNow, new List<int>(){0,1,2});
return planning;
}
在客户端,结果是一个对象,它的属性是一个日期,不包含毫秒。
如果我返回一个数组:return planning.ToArray();
,结果是一个对象键值数组,日期为毫秒。
那么为什么该格式应用于数组中的日期而不是字典中的日期呢?
不使用IsoDateTimeConverter
作为字典键的原因是Json。NET不序列化键-它只是将它们转换为字符串。来自文档:
序列化字典时,字典的键被转换为字符串并用作JSON对象属性名。为键编写的字符串可以通过覆盖键类型的ToString()或实现TypeConverter来定制。TypeConverter还支持在反序列化字典时再次将自定义字符串转换回来。
因此,在将字典键转换为JSON时,不使用包括IsoDateTimeConverter
在内的转换器。
话虽这么说,IsoDateTimeConverter
不再是必要的。从JSON中序列化日期
从Json。. NET 4.5及以后的日期默认情况下使用ISO 8601格式编写,不需要使用此转换器。
通过设置JsonSerializerSettings可以获得相同的日期格式。DateFormatString:
config.Formatters.JsonFormatter.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'";
但是这如何影响字典键到JSON的转换?结果是Json。NET 在将DateTime
转换为string
作为字典键时,尊重此设置,如参考源中所示。因此:
var time = DateTime.Now;
Dictionary<DateTime, IEnumerable<int>> planning = new Dictionary<DateTime, IEnumerable<int>>();
planning.Add(DateTime.UtcNow, new List<int>() { 0, 1, 2 });
var root = new { today = time, planning = planning };
var settings = new JsonSerializerSettings
{
DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc,
DateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'",
};
var json = JsonConvert.SerializeObject(root, Formatting.Indented, settings);
Console.WriteLine(json);
为用作字典键和用作属性的DateTime
值生成所需的格式一致的输出:
{ "today": "2016-09-09T03:54:51.704Z", "planning": { "2016-09-09T03:54:51.704Z": [ 0, 1, 2 ] } }