Devolver JSON desde un script PHP

Quiero devolver JSON desde un script PHP.

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

preguntado Oct 31 '10, 18:10

19 Respuestas

Aunque normalmente está bien sin él, puede y debe configurar el Content-Type encabezamiento:

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

Si no estoy usando un marco en particular, generalmente permito algunos parámetros de solicitud para modificar el comportamiento de salida. Puede ser útil, generalmente para solucionar problemas rápidamente, no enviar un encabezado o, a veces, print_r la carga útil de datos para observarlo (aunque en la mayoría de los casos, no debería ser necesario).

Respondido 17 Jul 20, 19:07

por si acaso: debe usar los comandos header () solo además del búfer de salida para evitar advertencias de "encabezados ya enviados" - Kevin

El archivo php debe estar codificado en UTF-8 sin BOM :) - Krzysztof Kalinowski

header('Content-type:application/json;charset=utf-8'); - Timo Huovinen

@mikepote En realidad, no creo que sea necesario tener el comando de encabezado en la parte superior del archivo PHP. Si estás escupiendo cosas sin darte cuenta y eso está haciendo saltar tu comando de encabezado, solo necesitas arreglar tu código porque está roto. - Halfstop

@KrzysztofKalinowski no, el archivo PHP no necesita estar codificado en UTF-8. la salida DEBE estar codificada en UTF-8. Esas declaraciones incorrectas no ayudan a los usuarios sin experiencia a aprender cómo evitar que las cosas se rompan, pero ayudan a desarrollar mitos sobre ellos y nunca a aprender qué papel juegan las codificaciones en las transmisiones y cómo funcionan. - Áxel Costas Peña

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

Respondido 26 Oct 16, 16:10

Según la manual encendido json_encode el método puede devolver una no cadena (false):

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

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

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

Esta condición de error debe capturarse en PHP, por ejemplo, así:

<?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(["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 del jsonError propiedad indica una condición de error, que debe tratar en consecuencia.

En el modo de producción, sería 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.

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

Respondido 06 Feb 20, 23:02

No hay charset parámetro para JSON; ver la nota al final de tools.ietf.org/html/rfc8259#section-11: "No se define ningún parámetro 'juego de caracteres' para este registro. Agregar uno realmente no tiene ningún efecto en los destinatarios compatibles". (JSON debe transmitirse como UTF-8 por tools.ietf.org/html/rfc8259#section-8.1, por lo que especificar que está codificado como UTF-8 es un poco redundante). Patrick Dark

Gracias por resaltar eso, @PatrickDark. Redundante charset parámetro eliminado de la cadena de encabezado HTTP. - trincot

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

respondido 19 mar '19, 06:03

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

Respondido 31 Oct 10, 21:10

También es bueno configurar la seguridad de acceso; simplemente reemplace * con el dominio que desea para 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 omitir Access-Control-Allow-Origin?

Respondido el 01 de Septiembre de 17 a las 17:09

¿Qué significa si esto no funciona? Por ejemplo, para restringir solo a las llamadas de CodePen, intenté header('Access-Control-Allow-Origin: https://cdpn.io');, pero aún puedo cargar la página desde mi propio navegador. - Ashleedawg

se utiliza para bloquear secuencias de comandos cruzadas (una secuencia de comandos que llama a otra página). Por lo tanto, podrá cargarlo directamente desde su navegador, pero no puede cargarlo desde otro dominio usando un script. - Dr. Aaron Dishno

Esta pregunta obtuvo muchas respuestas, pero ninguna cubre todo el proceso para devolver JSON limpio con todo lo necesario para evitar que la respuesta JSON tenga un formato incorrecto.


/*
 * returnJsonHttpResponse
 * @param $success: Boolean
 * @param $data: Object or Array
 */
function returnJsonHttpResponse($success, $data)
{
    // remove any string that could create an invalid JSON 
    // such as PHP Notice, Warning, logs...
    ob_clean();

    // this will clean up any previously added headers, to start clean
    header_remove(); 

    // Set the content type to JSON and charset 
    // (charset can be set to something else)
    header("Content-type: application/json; charset=utf-8");

    // Set your HTTP response code, 2xx = SUCCESS, 
    // anything else will be error, refer to HTTP documentation
    if ($success) {
        http_response_code(200);
    } else {
        http_response_code(500);
    }
    
    // encode your PHP Object or Array into a JSON string.
    // stdClass or array
    echo json_encode($data);

    // making sure nothing is added
    exit();
}

Referencias:

response_remove

ob_clean

JSON de tipo de contenido

Códigos HTTP

http_response_code

json_encode

Respondido 11 Jul 20, 02:07

gracias por la referencia ob_clean. Tenía una línea principal que estaba elevando mis llamadas fetch response.json (). - Chris Love

<?php
$data = /** whatever you're serializing **/;
header("Content-type: application/json; charset=utf-8");
echo json_encode($data);
?>

Respondido 28 Feb 19, 13:02

¿Cuál es la diferencia entre el juego de caracteres en el encabezado? Por favor explique, gracias. - Sanxofon

Una función simple para devolver un Respuesta JSON con Código de estado HTTP.

function json_response($data=null, $httpStatus=200)
{
    header_remove();

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

    http_response_code($httpStatus);

    echo json_encode($data);

    exit();
}

contestado el 12 de mayo de 20 a las 17:05

header_remove, y establecer explícitamente la respuesta http es una buena idea; aunque la configuración del estado y luego http_response parece redundante. Es posible que también desee agregar un exit declaración hasta el final. Combiné tu función con la de @trincot: stackoverflow.com/a/35391449/339440 - Stephen R

Como se dijo arriba:

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

hará el trabajo. pero ten en cuenta que:

  • Ajax no tendrá problemas para leer json incluso si no se usa este encabezado, 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 header () fallará.

Respondido el 28 de diciembre de 16 a las 23:12

La respuesta a tu pregunta es aquí,

Dice.

El tipo de medio MIME para texto JSON es application / json.

por lo tanto, si configura el encabezado en ese tipo y genera su cadena JSON, debería funcionar.

contestado el 23 de mayo de 17 a las 15:05

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

Respondido 29 Oct 15, 16:10

Sí, necesitará usar echo para mostrar la salida. Mimetype: aplicación / json

Respondido 31 Oct 10, 21:10

Si consulta una base de datos y necesita el conjunto de resultados en formato JSON, puede hacerlo así:

<?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 con jQuery, eche un vistazo a este tutorial.

Respondido 18 Oct 17, 02:10

Este es un script PHP simple para devolver el identificador de usuario masculino y femenino, ya que el valor json será cualquier valor aleatorio cuando llame al script json.php.

Espero que esto ayude gracias

<?php
header("Content-type: application/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;
?>

Respondido 23 Abr '19, 01:04

El tipo de medio MIME para texto JSON es application / json - AA

Una forma sencilla de formatear los objetos de su dominio a JSON es utilizar el Mariscal serializador. Luego pase los datos a json_encode y envíe el encabezado de tipo de contenido correcto para sus necesidades. Si está utilizando un marco como Symfony, no es necesario que se encargue de configurar los encabezados manualmente. Allí puedes usar el JsonResponse.

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

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

Para todos los demás fines, como el uso de una aplicación móvil 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);

Respondido el 06 de diciembre de 17 a las 02:12

Siempre que intente devolver una respuesta JSON para la API o, de lo contrario, asegúrese de tener los encabezados adecuados y también asegúrese de devolver datos JSON válidos.

Aquí está el script de muestra que le ayuda a devolver la respuesta JSON desde la matriz PHP o desde el archivo JSON.

Script PHP (Código):

<?php

// Set required headers
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');

/**
 * Example: First
 *
 * Get JSON data from JSON file and retun as JSON response
 */

// Get JSON data from JSON file
$json = file_get_contents('response.json');

// Output, response
echo $json;

/** =. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.  */

/**
 * Example: Second
 *
 * Build JSON data from PHP array and retun as JSON response
 */

// Or build JSON data from array (PHP)
$json_var = [
  'hashtag' => 'HealthMatters',
  'id' => '072b3d65-9168-49fd-a1c1-a4700fc017e0',
  'sentiment' => [
    'negative' => 44,
    'positive' => 56,
  ],
  'total' => '3400',
  'users' => [
    [
      'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
      'screen_name' => 'rayalrumbel',
      'text' => 'Tweet (A), #HealthMatters because life is cool :) We love this life and want to spend more.',
      'timestamp' => '{{$timestamp}}',
    ],
    [
      'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
      'screen_name' => 'mikedingdong',
      'text' => 'Tweet (B), #HealthMatters because life is cool :) We love this life and want to spend more.',
      'timestamp' => '{{$timestamp}}',
    ],
    [
      'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
      'screen_name' => 'ScottMili',
      'text' => 'Tweet (C), #HealthMatters because life is cool :) We love this life and want to spend more.',
      'timestamp' => '{{$timestamp}}',
    ],
    [
      'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
      'screen_name' => 'yogibawa',
      'text' => 'Tweet (D), #HealthMatters because life is cool :) We love this life and want to spend more.',
      'timestamp' => '{{$timestamp}}',
    ],
  ],
];

// Output, response
echo json_encode($json_var);

Archivo JSON (JSON DATA):

{
    "hashtag": "HealthMatters", 
    "id": "072b3d65-9168-49fd-a1c1-a4700fc017e0", 
    "sentiment": {
        "negative": 44, 
        "positive": 56
    }, 
    "total": "3400", 
    "users": [
        {
            "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", 
            "screen_name": "rayalrumbel", 
            "text": "Tweet (A), #HealthMatters because life is cool :) We love this life and want to spend more.", 
            "timestamp": "{{$timestamp}}"
        }, 
        {
            "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", 
            "screen_name": "mikedingdong", 
            "text": "Tweet (B), #HealthMatters because life is cool :) We love this life and want to spend more.", 
            "timestamp": "{{$timestamp}}"
        }, 
        {
            "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", 
            "screen_name": "ScottMili", 
            "text": "Tweet (C), #HealthMatters because life is cool :) We love this life and want to spend more.", 
            "timestamp": "{{$timestamp}}"
        }, 
        {
            "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", 
            "screen_name": "yogibawa", 
            "text": "Tweet (D), #HealthMatters because life is cool :) We love this life and want to spend more.", 
            "timestamp": "{{$timestamp}}"
        }
    ]
}

JSON Screeshot:

enter image description here

Respondido 20 ago 19, 13:08

En caso de que esté haciendo esto en WordPress, existe una solución simple:

add_action( 'parse_request', function ($wp) {
    $data = /* Your data to serialise. */
    wp_send_json_success($data); /* Returns the data with a success flag. */
    exit(); /* Prevents more response from the server. */
})

Tenga en cuenta que esto no está en el wp_head gancho, que siempre devolverá la mayor parte de la cabeza incluso si sale de inmediato. La parse_request viene mucho antes en la secuencia.

Respondido 15 Feb 21, 17:02

Usted puede utilizar esta pequeña biblioteca PHP. Envía los encabezados y te da un objeto para usarlo fácilmente.

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

Respondido 28 Abr '15, 19:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.