¿Devuelve JSON de PHP a JavaScript?

135

Tengo un script PHP que se llama a través de jQuery AJAX. Quiero que el script PHP devuelva los datos en formato JSON al javascript. Aquí está el pseudo código en el script PHP:

$json = "{";
foreach($result as $addr)
{
    foreach($addr as $line)
    {
        $json .= $line . "\n";
    }
    $json .= "\n\n";
}
$json .= "}";

Básicamente, necesito que los resultados de los dos bucles se inserten en $ json.

AquinasTub
fuente

Respuestas:

194

Php tiene una función de serialización JSON incorporada.

json_encode

json_encode

Úselo si puede y no sufre el síndrome No inventado aquí.

Kent Fredric
fuente
2
Excelente gracias. En realidad, había buscado esto antes de publicar en SO, pero no pensé que estaría disponible en mi hosting.
AquinasTub
Esta 'respuesta' no está completa y es poco útil. Vea la respuesta de aesede para obtener información más completa.
Funk Doc
@FunkDoc, el OP en cuestión estaba uniendo JSON a mano, bajo el supuesto de que era su única opción. Saber que no era su única opción era una solución adecuada. No hay obligación de que el resultado final de ese JSON se emita como respuesta HTTP. La información de "agregar un encabezado", aunque es útil para una situación, no le ayudará si lo que está haciendo con ese JSON no es simplemente "devolverlo literalmente a la página web". La pregunta no agregó aclaraciones al caso de uso.
Kent Fredric
(Además, configurar el encabezado no es estrictamente necesario para AJAX. Pido disculpas si parezco brusco, pero el tono dado por la palabra "respuesta" entre comillas realmente me hirió, fue hace 10 años, déjalo morir ya. Me mudé de PHP hace tanto tiempo que el idioma al que me mudé ahora también me estoy alejando.)
Kent Fredric
145

Aquí hay un par de cosas que faltan en las respuestas anteriores:

  1. Establecer encabezado en su PHP:

    header('Content-type: application/json');
    echo json_encode($array);
    
  2. json_encode()puede devolver una matriz de JavaScript en lugar de un objeto de JavaScript , consulte:
    Devolución de JSON desde un script PHP
    Esto podría ser importante saber en algunos casos ya que las matrices y los objetos no son lo mismo.

aesede
fuente
2
¡Es importante tener en cuenta que los datos se hacen eco en lugar de devolverlos ! Eso me mordió por un buen rato cuando aprendí el concepto. Porque en la programación general, casi todo se devuelve no "impreso".
Juha Untinen
Hola @Juha, ten en cuenta que json_encode()(como todas las funciones) siempre devuelve algo (incluido NULL); puede imprimir los datos, procesarlos y luego imprimirlo, assing a una variable para su uso posterior, guardarlo en un archivo, etc ... Puede leer más acerca returnde PHP: Volviendo valores . También puede (¡y debería!) Verificar qué función devuelve cada función que no conoce, consulte nuestro ejemplo json_encode () indica Devuelve una cadena codificada JSON en caso de éxito o FALSO en caso de error
aesede
En aquel entonces, me preguntaba por qué return json_encode($jsonArray);no funcionó (AngularJS http.get no obtuvo nada), hasta que más tarde lo noté :)
Juha Untinen
83

Hay una sección JSON en la documentación de PHP. Sin embargo, necesitarás PHP 5.2.0.

A partir de PHP 5.2.0, la extensión JSON está incluida y compilada en PHP de forma predeterminada.

Si no lo hace, aquí está la biblioteca PECL que puede instalar.

<?php
    $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

    echo json_encode($arr); // {"a":1,"b":2,"c":3,"d":4,"e":5}
?>
Ólafur Waage
fuente
13

Por lo general, también le interesaría tener alguna estructura para sus datos en el extremo receptor:

json_encode($result)

Esto preservará las claves de la matriz también.

Recuerde que json_encode solo funciona en datos codificados con utf8.

Jukka Dahlbom
fuente
4

Puede usar Simple JSON para PHP . Envía los encabezados que te ayudan a forjar el JSON.

Parece que :

<?php
// Include the json class
include('includes/json.php');

// Then create the PHP-Json Object to suits your needs

// Set a variable ; var name = {}
$Json = new json('var', 'name'); 
// Fire a callback ; callback({});
$Json = new json('callback', 'name'); 
// Just send a raw JSON ; {}
$Json = new json();

// Build data
$object = new stdClass();
$object->test = 'OK';
$arraytest = array('1','2','3');
$jsonOnly = '{"Hello" : "darling"}';

// Add some content
$Json->add('width', '565px');
$Json->add('You are logged IN');
$Json->add('An_Object', $object);
$Json->add("An_Array",$arraytest);
$Json->add("A_Json",$jsonOnly);

// Finally, send the JSON.

$Json->send();
?>
Alexis Paques
fuente
Advertencia: Simple JSON para PHP tiene licencia GPLv2, por lo que su propio código debe ser de código abierto para poder usarlo.
Jamie Birch
1
Ahora licencia MIT :)
Alexis Paques
1
@JamieBirch En la práctica, creo que no entiendes cómo funciona GPL. Si estuvieras hablando de AGPL, entonces estarías en algo. Pero grandes extensiones de Internet se basan en el software GPL y no tienen la obligación de abrir su código, ya que no les dan a los usuarios ningún ejecutable bajo su control, solo proporcionan una interfaz para él. La única obligación que tienen es que cualquier persona a la que le entreguen copias digitales del proyecto también debe recibir una fuente.
Kent Fredric
1

$ msg = "Ingresas nombre de usuario o contraseña incorrectos"; $ responso = json_encode ($ msg);

echo "{\"status\" : \"400\", \"responce\" : \"603\", \"message\" : \"You Enter Wrong Username OR Password\", \"feed\":".str_replace("<p>","",$responso). "}";
iamasp
fuente