4

我已经阅读了很多很多关于同一问题的问答,但没有一个是我的具体问题(至少不是我能找到的)。

我有一个回显 json 字符串的 php 脚本

header('Content-Type: application/json');
echo $result;

返回的 JSON(使用JSONLint检查并且有效):

{"Announcement":{"ID":1,"Type":1,"Text":"This is a test Albums announcement.","TimeStart":"1969-12-31","TimeEnd":"1969-12-31"}}

还有一个读取 json 的 web jquery 脚本:

$.ajax({
        type : "GET",
        url : "http://b***s.net/S****s/GetAnnouncements.php?callback=?",
        data : {get_param : "Announcement"},
        dataType : "json",
        error : function(jqXHR, textStatus, errorThrown) {alert(errorThrown); alert(textStatus);},
        success : function(data) {alert('success');
            $.each(data, function(index, element) { alert('here');
                $("#announcements-list").append("<li><a id='announcements-a-" + element.ID + "' href='#announcement-details'><p>" + element.Type + ": " + element.Text + "</p></a></li>");
                $("#announcements-a-" + element.ID).bind('click', function() {Announcements.AnnouncementID = element.ID;});
            });
            $("#announcements-list").listview('refresh');
        }
    });

success:永远不会被调用。并error:返回atextStatus和是"parsererror"errorThrown"Error: jQuery1830649454693285679_1359620502896 was not called"

  • 我已添加callback=?到 url 以解决跨域问题。
  • 我已经发送header('Content-Type: application/json');到 php,它返回 NO html。
  • 我已经用JSONLint验证了 JSON 的有效性
  • 我已经尝试删除data: "json"一些答案所说的,但仍然返回一个parsererror
  • 使用 jQuery 1.8.3
4

2 回答 2

4

您的服务器和客户端脚本不会相互补充。你有两个选择:


让您的服务器端脚本返回 JSON:

Content-Type: application/json

{"Announcement":{"ID":1}}

并省略回调参数:

$.ajax({
    type : "GET",
    url : "http://example.com/feed/json.php",
    dataType : "json"
});

让您的服务器端脚本返回 JSONP,即 JSON 包装在回调函数中:

Content-Type: application/javascript

jQuery_xxxxxxxx({"Announcement":{"ID":1}});

并将数据类型更改为 jsonp:

$.ajax({
    type : "GET",
    url : "http://example.com/feed/json.php",
    dataType : "jsonp"
});

请注意,jQuery 会默默地附加&callback=jQuery_xxxxxxxx到此类请求的 URL。服务器应使用 URL 中指定的回调名称。你可以这样做:

echo sprintf(
    "%s(%s);",
    isset($_GET["callback"]) ? $_GET["callback"] : "void",
    json_encode($data)
);
于 2013-01-31T09:02:40.153 回答
2

我刚刚尝试过,这是在跨域中测试的解决方案

$.ajax({
    type : "GET",
    url : "http://******/14621356.php",
    data : {get_param : "Announcement"},
    dataType : "jsonp",
    error : function(jqXHR, textStatus, errorThrown) {alert(errorThrown); alert(textStatus);},
    success : function(data) {alert('success');
        $.each(data, function(index, element) { alert('here');
            $("#announcements-list").append("<li><a id='announcements-a-" + element.ID + "' href='#announcement-details'><p>" + element.Type + ": " + element.Text + "</p></a></li>");
            $("#announcements-a-" + element.ID).bind('click', function() {Announcements.AnnouncementID = element.ID;});
        });
        $("#announcements-list").listview('refresh');
    }
});

而对于 php

header('Content-Type: application/json');
echo $_GET['callback'].'('.'{"Announcement":{"ID":1,"Type":1,"Text":"This is a test Albums announcement.","TimeStart":"1969-12-31","TimeEnd":"1969-12-31"}}'.')';

注意 dataType 中的 jsonp。

于 2013-01-31T09:14:20.553 回答