如何使用JQuery从MVC反序列化JSON?

时间:2011-01-21 22:53:22

标签: asp.net-mvc json jquery

好的,它是星期五下午晚些时候,我一直在争取太长时间......我有一个返回JSON的MVC2类。尝试在浏览器中反序列化时,JQuery会抛出错误。

这是控制器:

<HttpPost()>
Function ChangeAddress(ByVal addressId As Integer) As ActionResult

    ' Build and return JSON containing address.
    Dim v As New TestViewModel With {.Address1 = "My House"}
    Return Json(v)

End Function

以下是视图模型:

Public Class TestViewModel

    Public Property Address1 As String

End Class

这是剧本:

// If list is not empty and item was found...
if (found == true) {

         var sum = 14;

    // Get fields of newly selected address.
    $.ajax({
        url: '../../Checkout/ChangeAddress',
        type: 'POST',
        traditional: true,
             data: { addressId: sum },
        success: function (result) {

            var json = result.get_data();
            var data = Sys.Serialization.JavaScriptSerializer.deserialize(json);

            alert("Success!");

        }
    });
};

反序列化代码来自MVC Music Store示例。执行时,JQuery在get_data上抛出异常,说“对象不支持此属性或方法”。好的,所以我尝试评论该行并尝试反序列化(结果)。然后异常说“Sys.ArgumentException:无法反序列化。数据与有效的JSON不对应。参数名称:数据”。

我哪里错了?

1 个答案:

答案 0 :(得分:2)

您不需要显式解析(“反序列化”)您的JSON! jQuery会尝试自动执行此操作,前提是它可以正确猜出返回的dataType。当然,您可以指定您期望JSON:

$.ajax({
    url: '../../Checkout/ChangeAddress',
    type: 'POST',
    dataType: 'JSON',               // <========== this line
    traditional: true,
    data: {addressId: sum},
    success: function (result) {

        var json = result.get_data();
        var data = Sys.Serialization.JavaScriptSerializer.deserialize(json);

        alert("Success!");
    }
});

那就是说 - 可能是XHR没有返回有效的JSON。您是否可以提供返回到jQuery success回调的JSON示例?