2010-05-14 20 views
6

estoy frente al problema de la recepción de una matriz vacía cuando hago una petición AJAX de la siguiente manera:jQuery AJAX PHP JSON problema

Este es el código que estoy ejecutando en 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> 

Y este es el código en PHP:

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

print_r($m_decoded); 
exit; 
?> 

Y todo lo que obtenemos de esto, el uso de herramientas para desarrolladores de Chrome es una matriz vacía:

Array 
(
) 

¿Alguna pista sobre qué estoy haciendo mal?

El sJSON cadena se está codificando correctamente, esto es lo que me pasa cuando hago una "alerta" en la que uno:

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

gracias a todos por adelantado!

Respuesta

0

Finalmente lo hice funcionar !.Decía así:

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"])); 

Tenga en cuenta que tuve que usar "stripslashes" ya que la cadena JSON tenía barras como el "carácter

Gracias a todos por toda su ayuda, espero que esto ayude a otra persona.

+0

Bueno, funcionó, pero podrías haber simplemente dicho 'data: mJSON' y no es necesario mencionar' processData', tampoco es necesario convertirlo a JSON con 'var sJSON = $ .toJSON (mJSON.id_consulta);'. Simplemente podría haber escrito 'data: mJSON' y eliminar' processData parameter' .... En PHP end obtendría directamente una matriz que no necesita 'decode' ni' stripslash' – swapnilsarwe

+0

vea el código [en pastebin] (http : //pastebin.com/iM3cnE0G) – swapnilsarwe

2

Desde JavaScript, lo que necesita para pasar los datos de este tipo, como pares de valores clave:

data: {"mydata" : sJSON}, 

En el lado de PHP, ya que $_POST es un arreglo asociativo a continuación, puede acceder a sus datos de este modo:

$m_decoded = $_POST['mydata']; 
+0

Hola Justin, gracias pero yo obtener nada con esto =/ – Arturo

+0

Hmmm. ¿Has probado usar Firebug para ver lo que realmente se envía en la solicitud POST? –

+0

Además, ¿por qué dices 'contentType:" application/json; charset = utf-8 ",' en lugar de 'contentType:' "application/json" ' –

1

No está decodificando JSON en PHP-side.

Trate json_decode

+0

Sí, pero en su ejemplo creo que solo señalaba que la matriz '$ _POST' estaba vacía . Presumiblemente, una vez que se reciban los datos, necesitaría usar 'json_decode' para hacer algo útil con él. –

0

Hay varios problemas en su código:

  1. Usted está declarando dataType: "json" pero el servidor no devuelve JSON, se devuelve texto sin formato. Desde el documentation:

    The type of data that you're expecting back from the server. If none is specified, jQuery will intelligently try to get the results, based on the MIME type of the response (an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string).

  2. No creo que jQuery puede transformar con éxito sus datos a una cadena de consulta. Está intentando enviar una matriz de objetos:

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

    Use Firebug y examine qué datos se envían realmente. Si desea enviar toda la cadena como JSON, hay que establecer la opción processData false:

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

    y hay que decodificar la cadena en el lado del servidor:

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

Gracias por su respuesta rápida Felix, pero creo que no funcionó, he cambiado mi petición ajax a esto: \t \t \t \t $ .ajax ({ \t \t \t \t \t tipo: "POST", \t \t \t \t \t url: "getUbicaciones.php", \t \t \t \t \t datos: "json =" + $ .toJSON (mJSON.id_consulta), \t \t \t \t \t \t \t \t \t \t processData: falso, \t \t \t \t \t \t \t \t éxito: function (Respuesta) {\t \t \t \t \t \t \t \t alert ("Éxito:" + Respuesta); \t \t \t \t \t}, \t \t \t \t \t error: function (solicitud, error) { \t \t \t \t \t \t alerta ("Error:" + request.statusText +"."+ Error); \t \t \t \t \t} \t \t \t \t}); \t Y en PHP que hice esto: $ m_decoded = json_decode ($ _POST [" json "]); Pero el resultado ahora está vacío, $ m_decoded está vacío, ¿hay alguna otra pista? – Arturo

+0

Estoy recibiendo esto en PHP (codificado json): [{\ "id \": 0}, {\ "id \": 1}, {\ "id \": 2}] y el intento de decodificación con json_decode, devuelve "vacío". Estoy intentando esto: $ m_decoded = json_decode ($ _ POST ["json"]); y el resultado es nada. – Arturo

+0

¡Finalmente lo hizo funcionar, sus comentarios fueron muy útiles! – Arturo

Cuestiones relacionadas