Apuntes sobre Php

Lleva décadas en el obituario y sigue aquí.

JSON en PHP

JSON (JavaScript Object Notation) es el formato de intercambio de datos más usado en la web. PHP incluye funciones nativas para convertir entre arrays/objetos PHP y cadenas JSON, lo que lo hace imprescindible para comunicarse con APIs externas, guardar configuración o responder a peticiones AJAX.

¿Qué es JSON?

JSON es texto plano con una sintaxis concreta: objetos entre llaves, arrays entre corchetes, strings entre comillas dobles, números, booleanos y null. Es independiente del lenguaje, por eso se usa como lingua franca entre servicios.

{
    "nombre": "Ana",
    "edad": 32,
    "activo": true,
    "etiquetas": ["php", "web"],
    "direccion": null
}

json_encode()

Convierte un array u objeto PHP en una cadena JSON:

<?php

$usuario = [
    "nombre" => "Ana",
    "edad"   => 32,
    "activo" => true,
];

echo json_encode($usuario);
// {"nombre":"Ana","edad":32,"activo":true}

Tres flags que usarás con frecuencia:

  • JSON_PRETTY_PRINT: añade sangría y saltos de línea (útil para depurar o archivos de configuración).
  • JSON_UNESCAPED_UNICODE: deja los caracteres UTF-8 tal cual en lugar de convertirlos a \uXXXX.
  • JSON_UNESCAPED_SLASHES: no escapa las barras / (útil para URLs).
<?php

$datos = ["ciudad" => "Málaga", "url" => "https://ejemplo.com/ruta"];

echo json_encode($datos, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
// {
//     "ciudad": "Málaga",
//     "url": "https://ejemplo.com/ruta"
// }

json_decode()

Convierte una cadena JSON en un valor PHP. Por defecto devuelve un objeto stdClass; pasando true como segundo argumento devuelve un array asociativo (lo más habitual en PHP):

<?php

$json = '{"nombre":"Ana","edad":32,"etiquetas":["php","web"]}';

$datos = json_decode($json, true);   // array asociativo

echo $datos["nombre"];               // Ana
echo $datos["etiquetas"][0];         // php

Si el JSON no es válido, json_decode() devuelve null. Hay que comprobarlo:

<?php

$datos = json_decode($cadenaExterna, true);

if ($datos === null) {
    echo "JSON inválido";
}

Manejo de errores

La forma moderna de detectar errores es pasar el flag JSON_THROW_ON_ERROR. Con él, tanto json_encode() como json_decode() lanzan una excepción JsonException en lugar de devolver false/null en silencio:

<?php

try {
    $datos = json_decode("{json roto}", true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
    echo "Error JSON: " . $e->getMessage();
}

Nota: Sin JSON_THROW_ON_ERROR, usa json_last_error() para obtener el código de error y json_last_error_msg() para el mensaje. El flag es más limpio y es la opción recomendada en código nuevo.

Uso práctico

Responder con JSON desde un script PHP (para peticiones AJAX o APIs):

<?php

header("Content-Type: application/json; charset=utf-8");

$respuesta = ["ok" => true, "mensaje" => "Datos guardados"];
echo json_encode($respuesta, JSON_UNESCAPED_UNICODE);
exit;

Leer un archivo de configuración JSON:

<?php

$contenido = file_get_contents(__DIR__ . "/config.json");
$config    = json_decode($contenido, true, 512, JSON_THROW_ON_ERROR);

echo $config["base_url"];

Guardar datos en un archivo JSON:

<?php

$datos = ["visitas" => 142, "ultima" => "2026-04-26"];
file_put_contents(
    __DIR__ . "/datos.json",
    json_encode($datos, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)
);

Nota: json_decode() tiene un tercer parámetro de profundidad máxima (por defecto 512). Si trabajas con JSON muy anidado y obtienes null sin razón aparente, puede que hayas superado el límite.

Recapitulación

  • json_encode($valor, $flags) convierte PHP a JSON. Los flags más útiles: JSON_PRETTY_PRINT, JSON_UNESCAPED_UNICODE, JSON_UNESCAPED_SLASHES.
  • json_decode($json, true) convierte JSON a array asociativo PHP. Sin true devuelve un objeto stdClass.
  • Usa JSON_THROW_ON_ERROR para que los errores lancen una excepción en lugar de devolver null/false en silencio.
  • Para responder con JSON: envía la cabecera Content-Type: application/json antes de hacer echo.

En la próxima lección: cabeceras HTTP en PHP: redirecciones, tipos de contenido y descarga de ficheros con header().

TOP