用于DateTime的WebApi序列化 - 如何反序列化?

avs*_*099 2 .net datetime

这段代码:

public class PhotoDescriptor
{
    public DateTime DateCreatedUtc { get; set; }
}

public class PhotosController : ApiController
{
    // GET api/photos
    public IEnumerable<PhotoDescriptor> GetListOfPhotos()
    {
        return new PhotoDescriptor[]
            {
                new PhotoDescriptor
                    {
                        DateCreatedUtc = DateTime.ParseExact(
                                "2012-07-24T00:28:41.8738770Z",
                                "o",
                                CultureInfo.InvariantCulture,
                                DateTimeStyles.None).ToUniversalTime(),
                    },
                new PhotoDescriptor
                    {
                        DateCreatedUtc = DateTime.ParseExact(
                                "2012-07-24T00:28:41.0000000Z",
                                "o",
                                CultureInfo.InvariantCulture,
                                DateTimeStyles.None).ToUniversalTime(),
                    },
            };
    }
Run Code Online (Sandbox Code Playgroud)

返回以下JSON:

[{"DateCreatedUtc":"2012-07-24T00:28:41.873877Z"},
 {"DateCreatedUtc":"2012-07-24T00:28:41Z"}]
Run Code Online (Sandbox Code Playgroud)

请注意,从日期时间中删除了尾随零.但是,当我试图解析这些字符串以获取我的DateTime时,我得到FormatException - String was not recognized as a valid DateTime:

var date = DateTime.ParseExact("2012-07-24T00:28:41.873877Z", "o", CultureInfo.InvariantCulture, DateTimeStyles.None);
Run Code Online (Sandbox Code Playgroud)

这是正确的,根据MSDN DateTime.ParseExact方法:

出现FormatException

s不包含与格式中指定的模式对应的日期和时间.

"o"格式定义如下:

YYYY ' - ' MM ' - ' dd'T'HH ':' 毫米 ':' SS fffffffK'.

如此明显尾随的零应该在那里.

它是WebApi中的错误,还是我做错了什么?我应该如何将日期/时间字段传递给我的.Net客户端?

谢谢.

Jon*_*eet 5

是的,您正在适当地解析硬编码值 - 但您的代码没有显示如何使用JSON编写它们.您的"应该"声明仅针对您正在解析的格式,当然这不会在DateTime自身内传播.

如果你想自己解析这些值(我不得不问为什么没有为你做...)你可以使用F而不是f:

DateTime value = DateTime.ParseExact(text, 
                                     "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFFK",
                                     CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

我并不是说它不是 WebApi中的错误 - 但我没有看到任何迹象表明它 WebApi中的错误来自你的帖子......而Scott Hanselman关于WebApi日期的帖子给出的例子就是"到第二个",表明这是故意的.