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

时间:2012-07-24 23:46:44

标签: .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(),
                    },
            };
    }

返回以下JSON:

[{"DateCreatedUtc":"2012-07-24T00:28:41.873877Z"},
 {"DateCreatedUtc":"2012-07-24T00:28:41Z"}]

请注意,从日期时间中删除了尾随零。但是当我试图解析这些字符串以使我的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);

这是正确的,根据MSDN DateTime.ParseExact Method

  

FormatException

     

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

"o"格式is defined如下:

  

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

。“

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

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

谢谢。

1 个答案:

答案 0 :(得分:5)

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

如果您想自己解析这些值(我不得不问为什么没有为您完成...),您可以使用F代替f

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

我不是说不是 WebApi中的错误 - 但我没有看到任何迹象表明 是你帖子中的WebApi中的错误。 ..和Scott Hanselman's post on dates in WebApi给出的例子“只是到了第二个”,这表明这是故意的。