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. Sintruedevuelve un objetostdClass.- Usa
JSON_THROW_ON_ERRORpara que los errores lancen una excepción en lugar de devolvernull/falseen silencio. - Para responder con JSON: envía la cabecera
Content-Type: application/jsonantes de hacerecho.
En la próxima lección: cabeceras HTTP en PHP: redirecciones, tipos de contenido y descarga de ficheros con header().