13

当我将具有日期属性的 json 对象发布到 ApiController 时,它不会反序列化为日期。

服务器站点代码:

public class MegaTestController : ApiController
{
    // POST /megatest
    public void Post(ttt value)
    {
        string sdf = "!sad";
    }
}

public class ttt
{
    public DateTime Date { get; set; }
    public string Name { get; set; }
}

然后我用提琴手做一个 POST 请求

POST http://localhost:62990/MegaTest HTTP/1.1

用户代理:提琴手

主机:本地主机:62990

内容类型:文本/json

内容长度:54

{ "日期":"/Date(1239018869048)/", "姓名":"老兄" }

但是进来的对象只有Name属性集,Date属性是 {01.01.0001 00:00:00}

我是否缺少任何标题或项目设置?


编辑:请求实际上来自HttpClient. 是否可以在发送请求之前格式化日期HttpClient

public Task<T> Create<T>(T item)
{
    var service = new HttpClient();
    service.BaseAddress = new Uri("http://localhost:62990");

    var method = typeof(T).Name + "s"; // in this case it will be ttts

    var req = new HttpRequestMessage<T>(item);
    req.Content.Headers.ContentType = new MediaTypeHeaderValue("text/json");

    return service.PostAsync(method, req.Content).ContinueWith((reslutTask) =>
    {
        return reslutTask.Result.Content.ReadAsAsync<T>();
    }).Unwrap();
}

var data = new ttt { Name = "Dude", Date = DateTime.Now };
Create(data);

编辑:这是 ASP MVC 4 Beta 的一个已知错误,ASP MVC 4 的最终版本将使用Json.net作为 json 序列化程序,直到那时您可以使用默认的 XML 序列化程序或为Json.net切换默认的 Json 序列化程序. 更多信息可以在hanselman 博客上找到

4

4 回答 4

17

尝试将您的日期/时间发布为“yyyy-MM-dd HH:mm:ss”。ASP MVC 会正确处理它。

于 2012-02-23T16:44:43.747 回答
9

对于 URL 编码的 POST 数据,Web API 似乎不接受旧 ASP.NET AJAX 格式的日期。目前似乎有两种格式可以接受 URL 编码的日期:

短日期字符串:“2012 年 2 月 23 日”

ISO:“2012-02-23T00:00:00”

后者是 ISO DateTime 格式,您可以找到各种代码片段来帮助将 JavaScript Date 对象转换为该格式。这里提到了几个:如何在 JavaScript 中输出 ISO 8601 格式的字符串?

如果您将该数据作为 JSON 发送并正确设置 Content-Type,Web API仍然接受 /Date()/ 格式:

$.ajax({
  url: 'MegaTest',
  type: 'POST',
  // Setting this Content-Type and sending the data as a JSON string
  //  is what makes the old /Date()/ format work.
  contentType: 'application/json',
  data: '{ "Date":"/Date(1239018869048)/", "Name":"Dude" }'
});
于 2012-02-23T17:23:38.017 回答
4

这是 ASP MVC 4 Beta 的一个已知错误,并且 ASP MVC 4 的最终版本将使用Json.net作为 json 序列化程序,直到那时您可以使用默认的 XML 序列化程序或为Json.net切换默认的 Json 序列化程序。更多信息可以在hanselman 博客上找到

下面是一个使用默认 XML SerializerDateTime通过 HttpClient 发送的小示例:

var service = new HttpClient();
service.BaseAddress = url;

var mediaType = new MediaTypeHeaderValue("application/xml");
XmlMediaTypeFormatter formater = new XmlMediaTypeFormatter();
var req = new HttpRequestMessage<T>(item, mediaType, new MediaTypeFormatter[] { formater });

service.PutAsync(method, req.Content);

但是,如果您想使用 json,那么这里有一篇关于将 JSON.NET 与 ASP.NET Web API 结合使用的好博文

于 2012-03-05T12:13:58.363 回答
1

ASP.Net Web API 使用了DataContractJsonSerializer围绕DateTime. 您应该改用 JSON.Net,并实现一个MediaTypeFormatter使用 JSON.Net 而不是 DataContractJsonSerializer 的方法。在这里查看我对类似问题的回答。

于 2012-02-28T00:13:28.710 回答