如何在网站中反序列化ajax调用的result.d中包含的字符串

本文关键字:result 字符串 包含 调用 ajax 网站 反序列化 | 更新日期: 2023-09-27 18:19:30

这是一个简化的流程,但更容易解释:我有一个应用程序,它使用JQuery调用一个web方法,它获取返回值并存储在一个隐藏字段中,以便在进行回发后代码可以访问该字段。

我有以下代码:

$.ajax({
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify({ contacts: _contacts }),
        dataType: 'json',
        url: '/MyPage.aspx/MyMethod',
        success: function (result) {
            hdn.val(result.d);
        }
    });

在我后面的代码中,我试图获得这些信息并对其进行解析:

    protected void btnRegister_Click(object sender, EventArgs e)
{
ContactInfo[] importedContacts = new JavaScriptSerializer().Deserialize<ContactInfo[]>(this.hdContacts.Value);
}

但我得到了一个例外:

值不能为null。参数名称:型

我发现问题出在这个_Type参数上,它在我的ContactInfo对象中不存在。我想知道如何反序列化这些信息。这应该很容易反序列化,因为它直接来自我的ajax调用。

编辑:关于"type"参数:它是由.NET Framework自动添加的,目的是序列化WebMethod MyPage.aspx/MyMethod的返回对象。我想,如果框架在序列化数据时添加这些信息,我可以使用相同的序列化程序来反序列化它…

在hdnValue中,我有以下字符串:

[{"__type":"Un.Socialize.ContactInfo","ID":"123","名字":"名字","姓氏":"姓氏","全名":"倒数第一","电子邮件":"email@email.com","昵称":"尼克","图片":"图片.jpg","AlreadyExists":false}]

如果我(在调试期间)删除"__type:…"参数,它就可以工作了。

阅读这篇文章时,我注意到问题不在webmeth响应上,而是在我的反序列化上。我不应该那样做。因为我有一些旧代码,所以我必须找到一个解决方法,也许将值存储在hdnField中,并在服务器端构建对象。

如何在网站中反序列化ajax调用的result.d中包含的字符串

最好的方法是进行单元测试。

请提供字符串"data:JSON.stringfy({contacts:_contacts})"

以及您的ContactInfo对象的结构。如果可能的话,在Chrome Developer Tool或Firebug中探查请求,并给出完整的HTTP post请求。然后我们可以立即找到解决方案。

实际情况是,您的ContactInfo有一个_Type字段,该字段不能为null,并且您提供的数据(通过jQuery/JON/AAJX/…)没有_Type字段。

因此,您必须调整ContactInfo或JSON数据,这可能与一样简单

function AddTypeToContacts(contacts) {
  var mangledcontacts=new Array();
  for (var i=0;i<contacts.Length;i++) {
    var c=contacts[i];
    if (!c._Type) c._Type='whatever';
    mangledcontacts[mangledcontacts.Length]=c;
  }
  return mangledcontacts;
}
$.ajax({
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify({ contacts: AddTypeToContacts(contacts) }),
        dataType: 'json',
        url: '/MyPage.aspx/MyMethod',
        success: function (result) {
            hdn.val(result.d);
        }
    });