【问题标题】:jQuery AJAX PHP JSON problemjQuery AJAX PHP JSON 问题
【发布时间】:2011-02-19 14:52:51
【问题描述】:

当我通过以下方式执行 AJAX 请求时,我遇到了接收空数组的问题:

这是我在 JavaScript 中执行的代码:

  <script type="text/javascript" src="lib/jquery.js"></script>
  <script type="text/javascript" src="lib/jquery.json.js"></script>
  <script type="text/javascript">   
   $(document).ready(function(){

    /* Preparar JSON para el request */
    var mJSON = new Object;
    mJSON.id_consulta = new Array;
    for (var i=0; i<3; i++){
     mJSON.id_consulta[i] = new Object;
     mJSON.id_consulta[i].id = i;
    }
    var sJSON = $.toJSON(mJSON); 

    $.ajax({
     type: "POST",    
     url: "getUbicaciones.php",  
     data: sJSON, 
     dataType: "json", 
     contentType: "application/json; charset=utf-8",              
     success: function(respuesta){  
      alert(respuesta);
     },
     error: function (request,error){
      alert("Error: " + request.statusText + ". " + error);
     }
    });  

   });
  </script>

这是PHP下的代码:

 <?php 
 /* Decodificar JSON */
 $m_decoded = $_POST;

 print_r($m_decoded);
 exit;
 ?>

使用 Chrome 的开发者工具,我从中得到的只是一个空数组:

Array
(
)

关于我做错了什么的任何线索?

字符串 sJSON 被正确编码,当我对该字符串进行“警告”时,我得到了这样的结果:

{"id_consulta":[{"id":1},{"id":2},{"id":3}]}

提前谢谢大家!

【问题讨论】:

    标签: php javascript jquery ajax json


    【解决方案1】:

    从您的 JavaScript 中,您需要像这样以键值对的形式传递数据:

    data: {"mydata" : sJSON},
    

    在 PHP 方面,由于 $_POST 是一个关联数组,因此您可以像这样访问您的数据:

    $m_decoded = $_POST['mydata'];
    

    【讨论】:

    • 嗯。您是否尝试过使用 firebug 查看 POST 请求中实际发送的内容?
    • 另外,你为什么说contentType: "application/json; charset=utf-8",而不是contentType: "application/json"`
    • 其实你不需要指定contentType,因为你要发布的是一个序列化的json数组,它最终会被转换成键值对字符串(jquery在内部做),contentType是用于告诉您要发送什么样的数据...在这种情况下,json 将被转换为键值对并以纯字符串形式发送...dataType: 'json' 足以让它工作
    • 如果你读过this link jquery ajaxData to be sent to the server. It is converted to a query string, if not already a string. It's appended to the url for GET-requests. See processData option to prevent this automatic processing. Object must be Key/Value pairs. If value is an Array, jQuery serializes multiple values with same key based on the value of the traditional setting (described below).
    【解决方案2】:

    您没有在 PHP 端解码 JSON。

    试试json_decode

    【讨论】:

    • 是的,但在他的示例中,我认为他只是指出$_POST 数组是空的。据推测,一旦收到数据,他将需要使用json_decode 来做一些有用的事情。
    【解决方案3】:

    您的代码中有几个问题:

    1. 您正在声明 dataType: "json" 但服务器不返回 JSON,它返回纯文本。来自documentation

      期望从服务器返回的数据类型。如果没有指定,jQuery 将根据响应的 MIME 类型智能地尝试获取结果(XML MIME 类型将产生 XML,在 1.4 中 JSON 将产生 JavaScript 对象,在 1.4 中脚本将执行脚本,以及任何else 将作为字符串返回)。

    2. 我不认为 jQuery 可以成功地将您的数据转换为查询字符串。您正在尝试发送对象数组:

      {"id_consulta":[{"id":1},{"id":2},{"id":3}]}
      

      使用 Firebug 并检查实际发送了哪些数据。 如果要将整个字符串作为 JSON 发送,则必须将 processData 选项设置为 false:

      $.ajax({
         type: "POST",    
         url: "getUbicaciones.php",  
         data: "json=" + $.toJSON(mJSON.id_consulta), 
         processData: false,
         //....
      

      你必须在服务器端解码字符串:

      $data = json_decode($_POST['json']);
      

    【讨论】:

    • 感谢您的快速响应 Felix,但我认为这不起作用,我将 ajax 请求更改为:$.ajax({ type: "POST", url: "getUbicaciones.php ", data: "json=" + $.toJSON(mJSON.id_consulta), processData: false, success: function(respuesta){ alert("Success:" + respuesta); }, error: function (request,error){ alert("错误:" + request.statusText + "." + error); } });在 PHP 中我这样做了: $m_decoded = json_decode($_POST["json"]);但是结果现在是空的,$m_decoded 是空的,还有其他线索吗?
    • 我在 PHP 中收到这个(json 编码):[{\"id\":0},{\"id\":1},{\"id\":2} ] 并尝试使用 json_decode 解码,它返回“空”。我正在尝试这个: $m_decoded = json_decode($_POST["json"]);结果什么都没有。
    【解决方案4】:

    终于成功了!事情是这样的:

    JavaScript:

    var sJSON = $.toJSON(mJSON.id_consulta);
    
    
                $.ajax({
                    type: "POST",    
                    url: "getUbicaciones.php",  
                    data: "json=" + sJSON,                  
                    processData: false,             
                    success: function(respuesta){       
    
                    },
                    error: function (request,error){
    
                    }
                }); 
    

    PHP:

    $m_decoded = json_decode(stripslashes($_POST["json"])); 
    

    请注意,我必须使用“stripslashes”,因为 JSON 字符串中的“字符”带有斜杠。

    感谢大家的帮助,我希望这对其他人有所帮助。

    【讨论】:

    • 它工作得很好,但你可以简单地说data: mJSON而无需提及processData,也无需使用var sJSON = $.toJSON(mJSON.id_consulta);将其转换为JSON。您可以简单地编写 data:mJSON 并删除 processData parameter.... 在 PHP 端,您将直接获得一个您不需要 decodestripslash 的数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多