【问题标题】:asp.net Web-Api JSON string deserializationasp.net Web-Api JSON 字符串反序列化
【发布时间】:2014-04-13 23:21:10
【问题描述】:

我按照this 教程创建了一个 Restful web-api 服务。 一切似乎都运行良好,我可以通过从正确的 url 请求以 JSON 格式获取所有预订。 我的问题在于 http POST。

我的 Javascript 是:

var url = 'http://localhost:9077/api/bookings';
....
    var newEvent = [];

    newEvent.EventDateTime = // (now);
    newEvent.Name = "MyFirstBooking";

    function btnSubmit_Click()
    {
        alert("Submit clicked: " + newEvent.Name + "\n" + newEvent.EventDateTime);

        $.ajax({
            type: "POST",
            url: url,
            data: JSON.stringify( { Bookings: newEvent }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data) { alert(data); }
        });
    }

警报显示正确的日期和正确的名称。 当我单击提交并检查提琴手时,看起来 JSON 格式正确:

 {"Bookings":[{"Name":"MyFirstBooking","EventDateTime":"2014-04-14T13:45:00.000Z"}]}

我的视图是 Bookings.cs :

public class Bookings
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime BookingDateTime { get; set; }
    public DateTime EventDateTime { get; set; }
    public int Duration { get; set; }
    public int UserID { get; set; }
}

在我的 BookingsController 我有:

    public HttpResponseMessage PostBooking(Bookings item)
    {
         // Implementation
    }

但是,当我在 PostBooking 之后放置断点时,item.EventDateTime 为 {01/01/0001 00:00:00} 并且 Name 为空。 似乎 JSON 没有被正确反序列化......?我不确定这发生在哪里,因为我在任何地方都找不到提到它...

谢谢。

【问题讨论】:

    标签: c# javascript json asp.net-web-api


    【解决方案1】:

    啊啊啊 javascript 中的日期。他们不是很有趣吗?您很可能必须在 javascript 中进行转换,或者查看此堆栈溢出问题以在您的 api 中实现自定义日期处理程序:

    ASP.NET Web API Date format in JSON does not serialise successfully

    编辑:啊,我还注意到您的 JSON 对象是一个数组。您需要更改签名以获取数组:

    public HttpResponseMessage PostBooking(IEnumerable<Bookings> items)
    {
         // Implementation
    }
    

    再次编辑:

    再想一想,我认为您的事件不需要是一个数组。我想你想这样做:

    var newEvent ={};
    

    这会将 newEvent 初始化为对象而不是数组。然后你可以留下你的签名。您可能还需要更改您的参数名称,例如他的回答中提到的 tomasofen。

    再次编辑:

    进一步思考:您不需要使用 {"Bookings": newEvent } 来根对象,只需这样做:

        $.ajax({
            type: "POST",
            url: url,
            data: JSON.stringify(newEvent),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data) { alert(data); }
        });
    

    您将 contentType 设置为 json。这会告诉您的 Web 应用程序内容应该是 json,然后由服务器处理和转换。通过对其进行字符串化,您可以将内容转换为字符串,从而更改 contentType。

    【讨论】:

    • 我删除了 DateTime 对象并引用了一个 'UserID' 属性,所以现在 Javascript 中没有对任何 DateTime obj 的引用,我仍然收到 null 的项目。我也改了newEvent = {};。我的新 JSON 字符串是 {"item":{"Name":"MyFirstBooking","UserID":2}}
    • 您是否也尝试过 tomasofen 的回答?我想他也可能是对的。
    • 我们不知道服务端的 Bookings 的定义,但仔细想想,它是复数形式,也许它实际上是某种集合。您可以尝试进行测试,将服务器函数中的 item 定义更改为简单的对象数组,以检查是否有其他问题失败...
    • 当我不进行字符串化时,Fiddler 的 JSON 选项卡中不会传递任何内容,但数据 Name=MyFirstBooking&amp;UserID=2 位于 RAW 选项卡中。我已将 Bookings.cs 类添加到我原来的问题中。此外,当我不进行字符串化时,PostBooking 中的item 为空。当我进行字符串化时,会创建对象,但所有属性都是 null/default
    • 是的,实际上我只是做了一些搜索,您可以对对象进行字符串化。我认为更重要的部分是不要创建称为预订的根属性。只需对 newEvent 对象进行字符串化。如果您考虑一下,您正在将一个带有书籍对象的对象传递给服务器。服务器只是期待一个预订对象。
    【解决方案2】:

    尝试在服务器方法中为变量使用与Json参数名称相同的名称:

    服务器端:

    public HttpResponseMessage PostBooking(Bookings item)
        {
             // Implementation
        }
    

    对于客户端(只需将“item”更改为参数名称):

    {"item":[{"Name":"MyFirstBooking","EventDateTime":"2014-04-14T13:45:00.000Z"}]}
    

    我对此有疑问,也许这是您的情况。告诉我们它是否有效尝试其他方法。

    还要检查服务器中的对象 Bookings 是否具有以相同方式写入的成员 Name 和 EventDateTime。

    【讨论】:

    • 但是 item 是一个数组。他的签名需要反映这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多