来自jQuery的JSON响应会引发“无效标签”

时间:2010-07-13 19:48:53

标签: jquery json label

       $.ajax({
  beforeSend: function(xhr) {
 xhr.setRequestHeader('Authorization', "Basic YWRtaW46YWRtaW4=");        
},
   url: "https://test.com/incident.do?JSON&callback=?&sysparm_action=getRecords",
   dataType: "json",
   contentType: "application/json",
   method: 'GET',
   success: function(a,b,c) { 
    alert(a);
         }          
 });

我按下按钮调用此函数... Firebug显示我得到了这个JSON响应(我知道它是有效的)[为了清晰起见截断]

{
    "records": [
        {
            "service_offering": "",
            "number": "INC0000009"
        },
        {
            "service_offering": "",
            "number": "INC0000010"
        }
]
}

Firebug显示错误“无效标签 https://test.com/incident.do?JSON&callback=jsonp1279049933243&sysparm_action=getRecords 第1行

我该如何解决这个问题? 谢谢!

6 个答案:

答案 0 :(得分:2)

您可能想验证该服务是否支持jsonp。如果不是,则需要设置服务器端代理。

Using jQuery to get json data returns invalid label error

答案 1 :(得分:2)

您的回复是JSON,这是有效的,但这不是jQuery所期待的。当您在URL中指定&callback=?时,jQuery期待JSONP响应,看起来不同,您的响应应该

jsonp1279049933243({
  "records": [
    {
        "service_offering": "",
        "number": "INC0000009"
    },
    {
        "service_offering": "",
        "number": "INC0000010"
    }
  ]
});

指定callback=?时会发生什么情况是jQuery为您的success函数生成了一个名称,在本例中为jsonp1279049933243,JSONP只需生成一个<script>标记即可页面,所以当它获取该URL时,它实际上只包含一个JavaScript文件,运行一个函数,而不是这个:

<script type="text/javascript">
  jsonp1279049933243({ "records": [....] });
</script>

现在有效的是:

<script type="text/javascript">
  { "records": [....] }
</script>

...这是无效的JavaScript。现在它当然是通过src=https://test.com/incident.do?JSON&callback=jsonp1279049933243&sysparm_action=getRecords加载的,但无效的语法/标签错误是相同的。

答案 2 :(得分:0)

你说你知道它有效。你能将它汇集到parseJSON函数中,看看你有没有运气呢?

$ parseJSON(str_json);

注意:您还没有提到您正在使用的jQuery版本。此方法仅在jQuery 1.4.1及更高版本中可用。

答案 3 :(得分:0)

你确定json有效吗?检查它是否在JSONLint验证。

答案 4 :(得分:0)

尝试将数据作为纯文本并将其转换为客户端的json。我使用“http://www.json.org/json2.js”脚本来执行此操作。它帮助我解决了我的应用程序中的“无效标签”问题。 (我提到了脚本,因为eval()函数没有帮助,不明白为什么......)

祝你好运:)

答案 5 :(得分:0)

如果您使用的是1.5.2(可能是旧版本),则可以在不需要或不需要时禁用jsonp。

因此,对于所有ajax调用,请在页面上的某处添加:

$.ajaxSetup({
    jsonp: null,
    jsonpCallback: null
});

或者只需拨打一个电话,请添加:

jsonp: null,
jsonpCallback: null,

所以在你的例子中:

$.ajax({
    beforeSend: function(xhr) {
        xhr.setRequestHeader('Authorization', "Basic YWRtaW46YWRtaW4=");        
    },
    url: "https://test.com/incident.do?JSON&callback=?&sysparm_action=getRecords",
    dataType: "json",
    contentType: "application/json",
    method: 'GET',
    jsonp: null,
    jsonpCallback: null,
    success: function(a,b,c) { 
        alert(a);
    }          
});