Pregunta Devolver JSON desde un script PHP


Quiero devolver JSON desde un script PHP.

¿Acabo de repetir el resultado? ¿Tengo que configurar el Content-Type ¿encabezamiento?


639
2017-10-31 18:23


origen


Respuestas:


Aunque generalmente no tiene problemas, puede y debe 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 marco particular, normalmente permito que algunos parámetros de solicitud modifiquen el comportamiento de salida. Puede ser útil, por lo general, para solucionar problemas rápidamente, no enviar un encabezado, o algunas veces imprimir la carga de datos para mirarlo (aunque en la mayoría de los casos, no debería ser necesario).


1168
2017-10-31 18:27



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

97
2017-07-31 15:26



Tratar json_encode para codificar los datos y establecer el tipo de contenido con header('Content-type: application/json');.


33
2017-10-31 18:27



De acuerdo con la manual en json_encode el método puede devolver una cadena (falso)

Devuelve una cadena codificada JSON en caso de éxito o FALSE en el fracaso

Cuando esto pasa echo json_encode($data) dará salida a la cadena vacía, que es JSON no válido.

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

Esta condición de error debe capturarse en PHP, por ejemplo, de esta manera:

<?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 receptor debe ser consciente de que la presencia del jsonError propiedad 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 su posterior investigación.

Obtenga más información sobre cómo lidiar con los errores de JSON en Documentación de PHP.


29
2018-02-14 11:56



Establecer el tipo de contenido con header('Content-type: application/json'); y luego repite tus datos.


12
2017-10-31 18:26



También es bueno establecer la seguridad de acceso: simplemente reemplace * con el dominio que desea que pueda alcanzarlo.

<?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 evitar Access-Control-Allow-Origin? 


6
2018-06-13 21:48



La respuesta a tu pregunta es aquí,

Dice.

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

entonces, si configura el encabezado para ese tipo y saca su cadena JSON, debería funcionar.


3
2017-10-31 18:26



Como se dijo anteriormente:

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

hará el trabajo. pero ten en cuenta que:

  • Ajax no tendrá problemas para leer json incluso si este encabezado no se usa, excepto si su json contiene algunas etiquetas HTML. En este caso, debe configurar 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 su llamada al encabezado () fallará.


2
2017-12-28 20:17



Esta es una simple secuencia de comandos PHP para devolver la identidad femenina y de usuario masculina, ya que el valor json tendrá un valor aleatorio a medida que llame al guión json.php.

Espero 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
2017-09-12 02:16