Devolver JSON desde un script PHP


Quiero devolver JSON desde un script PHP.

¿Me hago eco del resultado? ¿Tengo que configurar el encabezado Content-Type?

Author: dakab, 2010-10-31

15 answers

Aunque normalmente estás bien sin él, puedes y debes establecer el encabezado Content-Type:

<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);

Si no estoy usando un framework en particular, generalmente permito algunos parámetros de solicitud para modificar el comportamiento de salida. Puede ser útil, generalmente para la solución rápida de problemas, no enviar un encabezado, o a veces print_r la carga útil de datos al globo ocular (aunque en la mayoría de los casos, no debería ser necesario).

 1207
Author: timdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-21 11:02:32

Una pieza completa de código PHP agradable y claro que devuelve JSON es:

$option = $_GET['option'];

if ( $option == 1 ) {
    $data = [ 'a', 'b', 'c' ];
    // will encode to JSON array: ["a","b","c"]
    // accessed as example in JavaScript like: result[1] (returns "b")
} else {
    $data = [ 'name' => 'God', 'age' => -1 ];
    // will encode to JSON object: {"name":"God","age":-1}  
    // accessed as example in JavaScript like: result.name or result['name'] (returns "God")
}

header('Content-type: application/json');
echo json_encode( $data );
 99
Author: aesede,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-26 13:37:02

Intente json_encode para codificar los datos y establecer el content-type con header('Content-type: application/json');.

 34
Author: thejh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-31 18:27:03

De acuerdo con el manual sobre json_encode el método puede devolver una cadena que no sea ( false):

Devuelve una cadena codificada en JSON en caso de éxito o FALSE en caso de error.

Cuando esto sucede echo json_encode($data)mostrará la cadena vacía, que es no válida JSON.

json_encode por ejemplo fallará (y devolverá false) si su argumento contiene una cadena no UTF-8.

Esta condición de error debe ser capturada en PHP, por ejemplo como esto:

<?php
header("Content-Type: application/json");

// Collect what you need in the $data variable.

$json = json_encode($data);
if ($json === false) {
    // Avoid echo of empty string (which is invalid JSON), and
    // JSONify the error message instead:
    $json = json_encode(array("jsonError", json_last_error_msg()));
    if ($json === false) {
        // This should not happen, but we go all the way now:
        $json = '{"jsonError": "unknown"}';
    }
    // Set HTTP response status code to: 500 - Internal Server Error
    http_response_code(500);
}
echo $json;
?>

Entonces el extremo receptor debe, por supuesto, ser consciente de que la presencia de la propiedad jsonError indica una condición de error, que debe tratar en consecuencia.

En el modo de producción podría ser mejor enviar solo un estado de error genérico al cliente y registrar los mensajes de error más específicos para una investigación posterior.

Lea más sobre cómo lidiar con errores JSON en la Documentación de PHP.

 32
Author: trincot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-10 07:51:24

Establezca el tipo de contenido con header('Content-type: application/json'); y luego haga eco de sus datos.

 13
Author: Brad Mace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-31 18:26:13

También es bueno establecer la seguridad de acceso - simplemente reemplace * con el dominio que desea poder acceder a él.

<?php
header('Access-Control-Allow-Origin: *');
header('Content-type: application/json');
    $response = array();
    $response[0] = array(
        'id' => '1',
        'value1'=> 'value1',
        'value2'=> 'value2'
    );

echo json_encode($response); 
?>

Aquí hay más ejemplos sobre eso: ¿cómo eludir Access-Control-Allow-Origin?

 6
Author: Dr. Aaron Dishno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-01 14:53:47

La respuesta a tu pregunta está aquí ,

Dice.

El tipo de medio MIME para texto JSON es aplicación / json.

Así que si establece el encabezado a ese tipo, y muestra su cadena JSON, debería funcionar.

 3
Author: Codemwnci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:48

Como se dijo anteriormente:

header('Content-Type: application/json');

Hará el trabajo. pero tenga en cuenta que :

  • Ajax no tendrá ningún problema para leer json incluso si este encabezado no se utiliza, excepto si su json contiene algunas etiquetas HTML. En este caso, debe establecer el encabezado como application / json.

  • Asegúrese de que su archivo no esté codificado en UTF8-BOM. Este formato agrega un carácter en la parte superior del archivo, por lo que tu llamada a header() fallará.

 2
Author: Tom Ah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-28 20:17:09

Este es un script PHP simple para devolver masculino femenino y el id de usuario como valor json será cualquier valor aleatorio a medida que llame al script json.php .

Espero que esta ayuda gracias

<?php
header("Content-type: text/json");
$myObj=new \stdClass();
$myObj->user_id = rand(0, 10);
$myObj->male = rand(0, 5);
$myObj->female = rand(0, 5);
$myJSON = json_encode($myObj);
echo $myJSON;
?>
 2
Author: Bidyashish Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-12 02:16:26

Si necesita obtener json de php enviando información personalizada, puede agregar esto header('Content-Type: application/json'); antes de imprimir cualquier otra cosa, para que pueda imprimir su custome echo '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';

 1
Author: jacr1614,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-29 13:57:06

Sí, necesitarás usar echo para mostrar la salida. Tipo mime: application / json

 0
Author: Nev Stokes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-31 18:26:45

Puedes usar esta pequeña biblioteca PHP. Envía los encabezados y le da un objeto para usarlo fácilmente.

Parece :

<?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();
?>
 0
Author: Alexis Paques,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-28 16:37:48

Sí, simplemente establezca el encabezado HTTP apropiado, haga eco del resultado y luego salga del script.

 0
Author: Spencer Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-18 22:10:14

Si consulta una base de datos y necesita el conjunto de resultados en formato JSON, puede hacerlo de la siguiente manera:

<?php

$db = mysqli_connect("localhost","root","","mylogs");
//MSG
$query = "SELECT * FROM logs LIMIT 20";
$result = mysqli_query($db, $query);
//Add all records to an array
$rows = array();
while($row = $result->fetch_array()){
    $rows[] = $row;
}
//Return result to jTable
$qryResult = array();
$qryResult['logs'] = $rows;
echo json_encode($qryResult);

mysqli_close($db);

?>

Para obtener ayuda para analizar el resultado usando jQuery, eche un vistazo a este tutorial.

 0
Author: Eyece,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-17 23:25:42

Una manera fácil de formatear sus objetos de dominio en JSON es usar el serializador Marshal . Luego pase los datos a json_encode y envíe el encabezado Content-Type correcto para sus necesidades. Si está utilizando un framework como Symfony, no necesita tener cuidado de configurar los encabezados manualmente. Allí puede usar el JsonResponse.

Por ejemplo, el Tipo de Contenido correcto para tratar con Javascript sería application/javascript.

O si necesita soportar algunos navegadores bastante antiguos, lo más seguro sería text/javascript.

Para todos los demás propósitos, como una aplicación móvil, use application/json como el Tipo de contenido.

Aquí hay un pequeño ejemplo:

<?php
...
$userCollection = [$user1, $user2, $user3];

$data = Marshal::serializeCollectionCallable(function (User $user) {
    return [
        'username' => $user->getUsername(),
        'email'    => $user->getEmail(),
        'birthday' => $user->getBirthday()->format('Y-m-d'),
        'followers => count($user->getFollowers()),
    ];
}, $userCollection);

header('Content-Type: application/json');
echo json_encode($data);
 0
Author: Kingson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-05 23:11:19