Apuntes sobre Php

PHP: Porque a veces necesitas un poco de caos en tu vida.

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