【问题标题】:Serializing json objects while calling ajax asp.net callback page调用ajax asp.net回调页面时序列化json对象
【发布时间】:2009-07-18 14:27:09
【问题描述】:

我正在使用完全 ajaxified 的 asp.net 页面(使用 jquery lib)并调用另一个 asp.net 回调页面来获取/发布数据到服务器。 我的页面的一些用户在序列化 json 对象时遇到以下错误

反序列化时出错 类型的对象...对象类型...包含无效 utf8 字节

   $.ajax({
    type: "POST",
    async: false,
    url: 'AjaxCallbacks.aspx?Action=' + actionCode,
    data: {
       objectToSerialize: JSON.stringify(obj, null, 2)
    },
    dataType: "json",
    success: function(operationResult) {
       //handle success
    },
    error: function(xhttp, textStatus, errorThrown) {
       //handle error
    }
 });

为了解决这个问题,我添加了“contentType”选项...

 $.ajax({
    type: "POST",
    async: false,
    url: 'AjaxCallbacks.aspx?Action=' + actionCode,
    data: {
       objectToSerialize: JSON.stringify(obj, null, 2)
    },
    contentType: 'application/json; charset=utf-8', //<-- added to deal with deserializing error
    dataType: "json",
    success: function(operationResult) {
       //handle success
    },
    error: function(xhttp, textStatus, errorThrown) {
       //handle error
    }
 });

但现在我无法像以前那样在服务器端读取此对象:

string objectJson = Request.Params["objectToSerialize"].ToString();

我收到以下错误:“对象引用未设置为对象的实例。”

有什么想法吗?

【问题讨论】:

  • 你能检查一下传递给服务器的 post 参数是什么吗?使用 Firebug 进行检查。
  • 这是我在帖子标签 (firebug) objectToSerialize=%7B%0A++%22Id%22%3A+%22846%22%2C%0A++%22FolderId%22%3A+% 中找到的示例22405%22%2C%0A++%22Positio%22%3A+%22%22%0A%7D 参数选项卡(萤火虫)仅包含我认为我正在发布的操作代码,并且不应该能够通过参数列表访问此 json 对象在服务器上,它应该在表单集合中,尚不确定如何获取它..
  • 我想我应该阅读 Request.InputStream ...?

标签: jquery ajax json serialization


【解决方案1】:

您在第二种情况下获得NullReferenceException 的原因是因为您在发送请求时使用application/json 作为 Content-Type 标头,并且在服务器端 ASP.NET 期望数据在发送时以表单形式到达填充 Request 对象,因此它不包含 objectToSerialize 参数。您可以尝试以下方法:

contentType: 'application/x-www-form-urlencoded; charset=utf-8'

或者坚持application/json,手动读取解析请求流:

using (var reader = new StreamReader(Request.InputStream))
{
    var input = reader.ReadToEnd();
    var objectToSerialize = input.Split('=')[1];
}

【讨论】:

    【解决方案2】:

    这是我解决问题的方法: 由于我更改内容类型服务器认为数据应该来自表单集合,而不是来自 request.inputstream,所以我编写了读取和解码输入流的函数,其余代码没有更改:

      /// <summary>
      /// reads request input stream and decodes it so it can be deserialized to .net object
      /// </summary>
      /// <returns>decoded request input stream</returns>
      private string GetInputStream()
      {
         string inputContent;
         using (var sr = new System.IO.StreamReader(Request.InputStream))
            inputContent = sr.ReadToEnd();
    
         return Server.UrlDecode(inputContent);
      }
    

    到目前为止,这是可行的。

    刚刚意识到有一个类似于我的答案(2 分),但缺少解码,如果没有序列化到 .net 对象将不起作用。 此外,我不得不将 GetInputStream() 给定字符串从“jsonObjectName =”剥离,以成功序列化为 .net 对象,类似于拆分流字符串所建议的内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2011-01-26
      • 1970-01-01
      • 2010-11-04
      • 2013-06-07
      相关资源
      最近更新 更多