如何通过 ajax php 调用返回包含 json 对象的数组/json 对象?

Posted

技术标签:

【中文标题】如何通过 ajax php 调用返回包含 json 对象的数组/json 对象?【英文标题】:How can I return an array/json object containing json objects through an ajax php call? 【发布时间】:2013-10-02 22:31:17 【问题描述】:

基本上我想要做的是返回 mysql 查询的结果。我知道如何将查询结果的每一行放入它自己的 JSON 对象中,现在我只是在努力寻找一种方法,以便如果有多行结果将其返回给我的 jquery。 在我的 jquery 中,我调用了 $.ajax() 函数,对此我没有任何问题。我的问题在于成功部分,我希望能够执行以下操作:

$.ajax (
        type: "POST",
        url:"select.php",
        data: columns : "*",
               table : "tbUsers",
               conditions : "" ,
        success: function(results) 
            foreach (results as obj)
            
                JSON.parse(obj);
                $("#page").html(obj.id + " " + obj.name);
            
        
    );

我希望能够像 JSON 对象数组一样遍历结果变量。 results 变量是一个字符串,由 php 文件的所有输出组成。所以让我的问题而不是,我怎样才能改变它,以便函数得到一个数组,或者我如何把它变成一个数组?

我的 php 文件目前返回如下内容:

["0":1, "1":"name1", "id":1, "name":"name1" , "0":2, "1":"name2", "id":2, "name":"name2"]

【问题讨论】:

您将使用 PHP json_encode 函数创建一个 JSON 字符串,并将其发送回 jQuery,如果您将 dataType 设置为 JSON,它将自动为您解析字符串为 javascript 对象! JSON.parse(obj); 应该退出循环,成功的问题是什么? JavaScript 没有 foreach 循环。 为什么不只发送一个大的 json 字符串而不是多个较小的字符串? 但无论如何指定它并没有什么坏处。如果有的话,它可以避免没有副作用的问题。通过指定它,如果你的 php 失败并且什么也不返回,它会将你的 ajax 发送到错误回调而不是成功的字符串结果。 【参考方案1】:

尝试类似:

$.ajax (
    type: "POST",
    url:"select.php",
    data: columns : "*",
        table : "tbUsers",
        conditions : "" ,
    dataType: "json",
    success: function(results) 
        for( var i in results) 
            $("#page").html(results[i].id + " " + results[i].name);
        

    
);

注意数据类型:“json” - 这将为您将其全部解析为 JSON 对象。

【讨论】:

"这将为您将其全部解析为 javascript 对象或数组。" 对...但是没有 JSON 对象之类的东西。它只是一个对象。而且,由于他正在处理一个 sql 查询,我敢打赌结果将作为对象数组返回,并且不建议使用 for in 循环遍历数组。 如果 PHP 将 content-type 设置为 application/json,则 dataType: "json" 是不必要的。一个优点是使用 dataType 意味着如果返回了无效的 json,如果指定了错误处理程序,它将进入错误处理程序。 @Izkata 同意,但由于他专门对示例代码中的结果进行 json 解码,我认为情况并非如此。【参考方案2】:

引用你的问题

我知道如何将查询结果的每一行放入其自己的 JSON 对象

您需要发送一个大的 json 字符串而不是多个较小的字符串。您将无法遍历响应,因为它不是单个 json 字符串(它是多个 json 字符串)。

最好将 ajax 回调链接起来,因为将来使用它们作为选项将从 jquery 中删除。

$.ajax(
    url: ' your/url ',
    type: 'POST',
    dataType: 'json',
    data: param1: 'value1',
)
.done(function() 
    console.log("success");
)
.fail(function() 
    console.log("error");
)
.always(function() 
    console.log("complete");
);

http://api.jquery.com/jQuery.ajax/

弃用通知:jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调从 jQuery 1.8 开始被弃用。准备 您最终删除的代码,请使用 jqXHR.done()、jqXHR.fail()、 和 jqXHR.always() 代替。

【讨论】:

如果它是一个已解析为 JSON 并发送的数组,那么您应该能够对其进行迭代。 “因为将来会从 jquery 中删除选项。” 不,他们不会。该折旧通知是针对成功错误和完整的方法,而不是选项。 是的,但问题表明有多个较小的 json 字符串发送到服务器。 @kevin:“为最终删除准备您的代码”请参阅api.jquery.com/jQuery.ajax 它没有被删除。重新阅读您在答案中的引用,它没有引用 success: error:complete: 选项。【参考方案3】:

php你可以使用

echo json_encode($result); // result may contain multiple rows

在您的success 回调中,您可以使用

success: function(results) 
    var htmlStr = '';
    $.each(results, function(k, v)
        htmlStr += v.id + ' ' + v.name + '<br />';
   );
   $("#page").html(htmlStr);

A Demo to help you understand.

【讨论】:

这将解决问题(php部分),基本上和我建议的一样。但是最好不要使用成功回调作为选项。更好地链接你的回调。 @kasperTaeymans 在什么方面.donesuccess: 更好?当然,.done 有更多用途,但它并不是“更好”,它只是另一种实现方式。【参考方案4】:

您可以只返回一个大的 JSON 结果。因为您的每个 JSON 对象都可以包装在另一个中。

您返回的 JSON 将是一个对象数组(无论它们是什么)

 "objects": [(first object), (second object), ... ] 

然后在你的成功函数中,你可以遍历每个对象并更新页面:

var obj = JSON.parse(results);
jQuery.each(objs, function(i, obj) 
  $("#page").html(obj.id + " " + obj.name);
);

【讨论】:

【参考方案5】:

return 因为包装成功然后在你的成功函数中,你可以迭代每个对象并更新页面你可以只返回一个大的 JSON 结果。因为你的每个 JSON 对象都可以包装在另一个中。然后,您返回的 JSON 将是一个对象数组(无论它们是什么)

【讨论】:

以上是关于如何通过 ajax php 调用返回包含 json 对象的数组/json 对象?的主要内容,如果未能解决你的问题,请参考以下文章

前端ajax如何接受后台的model

如何构造 HighCharts 数据系列以匹配通过 ajax 调用返回的 Json

在 AJAX 调用中从 PHP 返回 JSON 对象?

PHP 脚本如何向 Dojo 的 xhrGet 发送 JSON Ajax 响应?

Laravel 路由上的 Ajax 调用,返回一个包含 ChartJS 标签日期的 json 编码数组

thinkphp中怎么返回json数据