为什么 IsoDateTimeConverter 不用于序列化 Dictionary<DateTime, int>



返回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
    ]
  }
}

相关内容

  • 没有找到相关文章

最新更新