【问题标题】:How does jQuery deserialize JSON?jQuery 是如何反序列化 JSON 的?
【发布时间】:2011-01-07 22:37:26
【问题描述】:

我正在使用 jQuery.ajax(...) 从 ASP.NET MVC 服务中检索 JSON 数据。当服务器遇到异常时,我将 400 Bad Request 状态发送回客户端并将我的异常作为 JsonResult 发送:

Response.StatusCode = 400;
return Json(new { ex.Message, ex.StackTrace });

这是我的 jQuery 代码:

$.ajax(
{
    type: "POST",
    url: deleteUrl,
    dataType: "json",
    data:
    {
        dataItems: dataItems,
        toJSON: true
    },
    success: function(msg)
    {
        alert(msg[i].dataItem);
    },
    error: function(request, status, error)
    {
        alert(request.responseText);
    }
});

我的 ASP.NET 代码将我发送到我的 JavaScript 代码的错误部分,错误块只允许我读取 request.responseText 而不能处理从服务器返回的对象。

现在,我不想在 json_parse 之类的东西中添加另一个 JavaScript 包含并简单地反序列化我的异常,我想简单地利用 jQuery 使用的同一个 JSON 解析器,尽管我找不到很容易找到关于它。

有人能指出正确的方向吗?

【问题讨论】:

  • 我在 Rick Strahl 的博客上发现了一篇帖子 (west-wind.com/weblog/posts/324917.aspx),它解释说:“请注意,ajaxJSON 函数需要 JSON 编码。jQuery 没有任何原生 JSON 编码功能(这似乎是一个很大的遗漏) , 但可能这样做是为了保持较小的占用空间)。但是有许多可用的 JSON 实现。上面我使用 Douglas Crockford 的 JSON2.js 文件将参数对象映射序列化为 JSON。"我以为我已经阅读了 jQuery 1.4 中的更改...
  • 改变的是 jQuery 现在将使用 JSON.parse 而不是 eval(如果可用)。 jQuery 从未提供(并且仍然不提供)对 JSON 序列化 的 OOTB 支持。
  • @Crescent,应该作为答案给出,而不是评论。
  • @Cheeso:这不是问题的答案。

标签: javascript jquery serialization json


【解决方案1】:

也许这可以帮助你。我用它来删除我的 json 中的 cmets 和空格:

json = eval( o.responseText
    .replace( /\/\*(.*)\*\/g, ' ' )
    .replace( /([^\:])\/\/[^\n]*\n/g, '$1' )
    .replace( /^\s|\s+|\s$/g, '' ) )

【讨论】:

  • 评论无论如何都不是合法的 JSON。为什么它们会在您的回复中返回?
【解决方案2】:

我认为在 javascript 中,如果你有一个 json 字符串,你可以使用 eval 来获取一个对象,即:

var myObject = eval('(' + myJSONtext + ')');

http://www.json.org/js.html 上有更多相关信息

【讨论】:

  • 不是最安全的数据解析方式。
  • 其实我收回我说的话。由于在这种情况下我只带回“安全”数据而不是用户提供的数据,因此我可以使用 eval 安全地反序列化请求数据。
  • $.ajax错误函数中,然后可以使用:function (xhr) { json = eval('('+xhr.responseText+')'); ... };
【解决方案3】:

如果我没记错的话,jQuery 曾经使用eval。从 1.4 开始,如果有的话,它会利用原生 JSON 反序列化器(例如 Firefox 中有一个)

【讨论】:

  • 有人知道 jQuery 是否为此公开了一个方便的方法吗?
  • @Peder: 是的,jQuery.httpData(request, "json") 会返回你解析的 JSON/JavaScript 对象。
  • 其实不必指定“json”; httpData 将默认为那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2013-03-26
  • 2014-02-27
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多