【问题标题】:jQuery.parseJSON - Chrome and Safari automatically parsing JSONjQuery.parseJSON - Chrome 和 Safari 自动解析 JSON
【发布时间】:2011-06-21 13:43:24
【问题描述】:

以下函数导致响应变量在 Chrome 和 Safari 中为空,但在 Firefox 中不为空。

function updatePage(response){ // This argument differs by browser

    response = jQuery.parseJSON(response);

    for(var i=0; i<response.length; i++){
        // conduct magic
    };

};

错误:

Uncaught TypeError: Cannot read property 'length' of null

这是因为向 jQuery.parseJSON() 提供除 JSON string 以外的任何内容都会返回 null。似乎 Chrome 和 Safari 会自动解析 JSON,而无需明确请求。如果我在尝试使用 jQuery 解析它之前测试“响应”参数,它已经是 Chrome 和 Safari 中的 JSON 对象。但是,在 Firefox 中它仍然是一个字符串。

我想出的跨浏览器处理此问题的唯一解决方案是通过检查其构造函数来确定“响应”是否已被解析:

function updatePage(response){

    if(response.constructor === String){
        response = jQuery.parseJSON(response);
    };

    for(var i=0; i<response.length; i++){
        // conduct magic
    };

};

我是否遗漏了什么,或者这是目前处理此问题的唯一方法?似乎 jQuery.parseJSON 会检测到用户代理,并在 Chrome/Safari 的情况下按原样返回参数。

相关信息

  • 这是 jQuery 1.6.1
  • 来自服务器的响应 Content-Type 是 application/json
  • 响应参数源自您的标准 jQuery AJAX 调用:

$.ajax({
    url: API_URL + queryString + '&limit=' + limit,
    type: 'GET',
    cache: false,
    context: document.body,
    success: updatePage,
    error: function(err){
        console.log('ERROR: ' + err);
    }
});

【问题讨论】:

    标签: jquery json


    【解决方案1】:

    不是 Chrome 或 Safari,而是 jQuery,如果它在响应中看到适当的 Content-Type,它会进行解析。 (更新:您添加到问题中的 Content-Type 是正确的。)我无法立即明白为什么它不会在 Firefox 上执行。

    您可以通过在您的呼叫中添加dataType: 'json' 来强制它始终进行解析,详细信息在the jQuery.ajax docs 中。那么你根本就不会调用parseJSONresponse 已经是反序列化的对象了。

    【讨论】:

    • 嗯,Content-Type 实际上是“application/json”。为什么在 Firefox 中没有发生这种情况?
    • 我想我们在玩编辑标签。你是对的,添加 dataType: 'json' 消除了这个问题。我仍然对为什么这个问题没有在 Firefox 中弹出感到烦恼。
    • @j33r:是的,这很奇怪。对于该内容类型,它也应该由 Firefox 上的 jQuery 自动解析,并且在我对 Firefox 3.6 和 4.0 的测试中它。我会仔细查看响应,不是因为您无法使用 dataType 解决它,而是因为它们可能有问题。
    • 我在 OSX 10.6.7 上运行 Firefox 4.0.1。响应头是:Server nginx Date Tue, 21 Jun 2011 07:50:31 GMT Content-Type application/json Transfer-Encoding chunked Connection keep-alive Access-Control-Allow-Orig... * Content-Encoding gzip 所以是的, 不知道。不过还是谢谢。
    • 我的 Firefox 13.0 在 Linux Mint 上遇到了 100% 相同的问题(巧合的是在 6 月 21 日)。我正在寻找它并找到了你的问题。感谢@ChrisCummings 的问题和 T.J.克劳德的答案。
    猜你喜欢
    • 2011-12-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多