【问题标题】:Jquery getJSON not firing callback with valid json responseJquery getJSON 不使用有效的 json 响应触发回调
【发布时间】:2011-07-22 10:27:24
【问题描述】:

我有一个返回有效 json 对象(由 jsonlint.com 验证)的服务器,如下所示:

"{\"encryption\": {\"key\": \"gKV0oPJwC5CBQxmn\"}}"

我的 html 文件如下所示:

<html>
  <head>
    <title>Testing Jsonp</title>
    <script type="text/javascript" src='jquery-1.4.4.js'></script>
    <script type="text/javascript" src='app.js'></script>
  </head>
  <body>
    <input type='text' value='thing' id='target' />
    <a href='' class='init'>Click</a>
  </body>
</html>

app.js 看起来像这样:

$(document).ready(function(){
  $('.init').click(function(event){
    $.getJSON("http://localhost:37280/sites/1/encode?callback=?", { key: $("#target").attr('value') }, function(data){
      alert('Success!');
    });
    event.preventDefault();
  });
});

当我点击“点击”时,Chrome 网络控制台表示请求已发送,我的服务器日志确认已收到请求,并且 chrome 表示已收到上述 json 字符串。但随后什么也没有发生。我没有收到导致我相信我的回调没有执行的警报。任何帮助将不胜感激!

【问题讨论】:

  • 响应是否实际上返回了 JSON 对象周围的引号?他们不应该在那里。
  • 添加一个错误处理程序并查看它的内容。
  • 我已经让服务器以两种方式返回字符串,它似乎对回调的执行没有影响。
  • 我注意到当我设置服务器返回 {"encryption": {"key": "gKV0oPJwC5CBQxmn"}} 而不是 "{"encryption": {"key": "gKV0oPJwC5CBQxmn"}} " Chrome 控制台抛出此错误:"Uncaught SyntaxError: Unexpected token :"
  • 还添加了一个不产生任何输出的错误处理程序。

标签: javascript jquery ajax json


【解决方案1】:

这不是有效的 JSON。 JSONLint 似乎(新?)声称原始字符串是有效的 JSON。这不是真的。 JSON 根必须始终是数组或对象。 RFC 4627 说:

"一个 JSON 文本是一个序列化的对象或 数组。”

此外,您使用的是 JSONP,因此您需要包含未在响应中显示的回调。

所以如果实际网址是http://localhost:37280/sites/1/encode?callback=jsonp1234

其中jsonp1234是jQuery选择的函数名,响应必须是:

jsonp1234({"encryption": {"key": "gKV0oPJwC5CBQxmn"}});

请注意,这与所有 JSONP 一样,实际上是 JavaScript。这样就可以跨域了。

【讨论】:

  • 不包括回调是我的错误。非常感谢!
猜你喜欢
  • 2013-09-07
  • 2012-02-21
  • 2023-03-04
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
相关资源
最近更新 更多