【问题标题】:Getting Response From Jquery JSON从 Jquery JSON 获取响应
【发布时间】:2012-04-21 02:49:54
【问题描述】:

我无法从我的 php jquery / json / ajax 获得响应。我不断将所有这些不同的教程组合在一起,但我似乎仍然无法将它们全部组合在一起,因为没有一个教程遵循我正在尝试做的事情。

现在我正在尝试将两个数组(因为没有简单的方法来传递关联数组)传递给我的 jquery ajax 函数并提醒它。这是我的代码:

PHP

$names = array('john doe', 'jane doe');
$ids = array('123', '223');

$data['names'] = $names;
$data['ids'] = $ids;

echo json_encode($data);

jQuery

function getList(){
    $.ajax({  
        type: "GET", 
        url: 'test.php', 
        data: "",  
        complete: function(data){ 
            var test = jQuery.parseJSON(data);
            alert(test.names[0]);
            alert("here");
        }
    },
        "json");
}
getList();

在我的 html 文件中,我真正调用的是用于调试目的的 javascript 文件。我知道我正在返回一个对象,但在我的名称部分出现空值错误,我不知道为什么。我错过了什么?

我的 PHP 文件返回

{"names":["john doe","jane doe"],"ids":["123","223"]}

好像到这里就结束了 Uncaught TypeError: Cannot read property '0' of undefined 所以我的 sub0 杀了我。

【问题讨论】:

  • 当我尝试解决这些问题时,我将其分为两个:服务器端和客户端。第 1 步:您的服务器是否以您期望的格式返回 JSON 对象?尝试在浏览器中点击 /test.php 并检查 JSON 响应。如果看起来不错,则在您的 JS 回调中输出 JSON 字符串。
  • 我认为在 $.ajax 中你必须在末尾设置 dataType: 'json' 而不是 'json' (你在 $.get OR $.post 中的做法)
  • 我的 php 文件对我来说似乎很好。除了警报之外,我将如何输出我的 json 以查看它的外观?
  • 在您的调试器、Firebug 或 Chrome 开发人员中,访问 NET 选项卡并查找您的请求。在“响应”或“JSON”部分,您可以看到服务器发送回浏览器的内容。
  • 浏览器保留在获取 php 生成的文件(JSON、CSS、XML 等)时如果没有获取内容类型的权利。你应该总是在你的 json_encode 函数之前写这个: header('Content type: application/json');这米

标签: php javascript jquery html json


【解决方案1】:

您应该在单个对象中传递 ajax() 函数的所有参数。所以,应该有“dataType”选项。此外,如果您明确设置数据类型,jQuery 将为您解析 JSON 数据。完成回调将接收解析的 JavaScript 对象作为参数。

function getList() {
    $.ajax({  
        type: "GET", 
        url: 'test.php', 
        data: "",  
        dataType: "json",
        success: function(test) { 
            alert(test.names[0]);
            alert("here");
        }
    });
}

【讨论】:

  • 对数据类型的良好调用。但是,我认为问题在于完整的回调不包含来自服务器的数据作为第一个参数。我在回答中包含了对完整回调的引用。如果您将“完成”更改为“成功”,我 100% 相信您的答案是正确的。
【解决方案2】:

看起来问题在于您使用的是完整回调而不是成功回调:

function getList(){
    $.ajax({  
        type: "GET", 
        url: 'test.php', 
        data: "",  
        success: function(data) { /* success callback */
            var test = jQuery.parseJSON(data);
            alert(test.names[0]);
            alert("here");
        }
    },
    "json");
}
getList();

来自jQuery AJAX文档:

成功(数据,文本状态,jqXHR)

请求成功时调用的函数。该函数获得三个参数: 从服务器返回的数据,根据 dataType 参数格式化;描述状态的字符串;和 jqXHR(在 jQuery 1.4.x 中,XMLHttpRequest)对象。从 jQuery 1.5 开始,success 设置可以接受一个函数数组。每个函数都会被依次调用。这是一个 Ajax 事件。

完成(jqXHR,文本状态)

请求完成时调用的函数(在执行成功和错误回调之后)。该函数获得两个参数:jqXHR(在 jQuery 1.4.x 中,XMLHTTPRequest)对象和一个对请求状态进行分类的字符串(“成功”、“未修改”、“错误”、“超时”、“中止”或“解析器错误”)。从 jQuery 1.5 开始,完整的设置可以接受一个函数数组。每个函数都会被依次调用。这是一个 Ajax 事件。

【讨论】:

    【解决方案3】:

    jQuery 想知道期望什么样的数据作为响应,否则它不知道如何解析它。

    因此,正如之前所说,您可以使用 dataType = 'json' 属性告诉 jQuery。

    function getList() {
        $.ajax({  
            type: "GET", 
            url: 'test.php', 
            data: "",  
            dataType: "json",
            success: function(data) { 
                console.log(data);
            }
        });
    }
    

    除此之外,最好让 PHP 将其内容呈现为 json 而不是 html。您可以通过在 PHP 脚本中的任何输出之前设置 header('Content-type: application/json'); 来使用此标头。所以:

    $names = array('john doe', 'jane doe');
    $ids = array('123', '223');
    
    $data['names'] = $names;
    $data['ids'] = $ids;
    
    header('Content-type: application/json');
    
    echo json_encode($data);
    

    【讨论】:

    • 当我尝试访问 sub 0 时仍然得到空值,我用我的 PHP 文件输出的内容更新了我的问题。
    • @Howdy_McGee 尽管它现在对你有用,但我修复了上面的代码,它现在也应该与 .ajax() 一起使用。
    • @Mosselman - 我在使用和不使用 dataType: 'json' 的情况下运行了一个 ajax 调用,并且回调仍然知道如何开箱即用地解析它。在jQuery Ajax Docs 中,dataType:'json' 在 jQuery 无法使用 mime 类型来确定返回类型的情况下很有帮助。在大多数情况下,这不是必需的。这也不是 OP 面临的问题。 OP 使用的是“完成”回调而不是“成功”。不过,我认为包含 dataType 是一种很好的做法,既可以作为备用,也可以作为通信清晰度。 +1,因为这都是很好的信息。
    • @jmort253 很高兴了解使用 mime 类型的 jquery,谢谢。因此,让 PHP 设置标题是一个好主意。我纠正了我的代码,因为我有同样的回调错误,应该自己编写代码。深夜编码从来都不是一个好主意。这应该是 Stackoverflow 上的第一条提示!
    • @Mosselman +1 更新答案,这对我也有用:3
    【解决方案4】:

    您可以使用 jQuery 提供的 $.getJSON 外观,这将为标准 JSON 请求设置所有必需的 ajax 参数:

    $.getJSON('test.php', function(response) {
        alert(response.names[0]);   // john doe
    }); 
    

    但是我认为问题的根源在于 1)您的服务器可能没有返回正确的响应代码和/或正确的标头(即:JSON 数据) - 但是至少对于后者而言,上述方法应该强制执行此操作结论。

    见:http://api.jquery.com/jQuery.getJSON

    【讨论】:

    • 我以为你想保留 $.ajax。通常我使用 $.get(....,'json')
    猜你喜欢
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 2019-04-04
    • 2017-06-18
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多