Lectura y escritura de JSON en PHP (json_encode y json_decode)

En PHP, trabajar con JSON es muy sencillo porque el lenguaje trae funciones nativas para convertir entre arrays/objetos de PHP y strings JSON:

1. Convertir un array PHP a JSON (json_encode)

Ejemplo básico

<?php
$usuario = [
    "nombre" => "Ana",
    "edad" => 28,
    "activo" => true
];

$json = json_encode($usuario);

echo $json;
// {"nombre":"Ana","edad":28,"activo":true}

🔎 Observaciones:

  • Los arrays asociativos de PHP se convierten en objetos JSON.
  • Los arrays indexados de PHP se convierten en arreglos JSON.

2. Convertir un objeto PHP a JSON

<?php
class Producto {
    public $codigo;
    public $descripcion;
    public $precio;
    public $disponible;

    public function __construct($codigo, $descripcion, $precio, $disponible) {
        $this->codigo = $codigo;
        $this->descripcion = $descripcion;
        $this->precio = $precio;
        $this->disponible = $disponible;
    }
}

$prod = new Producto(101, "Teclado mecánico", 1200.50, true);

echo json_encode($prod);
// {"codigo":101,"descripcion":"Teclado mecánico","precio":1200.5,"disponible":true}

3. Opciones útiles de json_encode

PHP permite controlar la salida JSON con constantes:

<?php
$datos = ["producto" => "Mouse", "precio" => 850.75];

echo json_encode($datos, JSON_PRETTY_PRINT);
// {
//     "producto": "Mouse",
//     "precio": 850.75
// }

echo json_encode($datos, JSON_UNESCAPED_UNICODE);
// {"producto":"Mouse","precio":850.75}  (sin escape de tildes/emojis)

Opciones comunes:

  • JSON_PRETTY_PRINT — salida con sangría.
  • JSON_UNESCAPED_UNICODE — no escapa caracteres Unicode (tildes, emojis).
  • JSON_UNESCAPED_SLASHES — no escapa /.

4. Convertir JSON a PHP (json_decode)

Ejemplo básico

<?php
$json = '{"nombre":"Luis","edad":35,"activo":false}';

// Convertir a objeto (por defecto)
$obj = json_decode($json);

echo $obj->nombre; // Luis
echo $obj->edad;   // 35

5. Convertir JSON a array asociativo

Si pasamos true como segundo parámetro de json_decode, obtenemos un array asociativo en vez de un objeto.

<?php
$json = '{"nombre":"María","edad":29,"activo":true}';

$array = json_decode($json, true);

echo $array["nombre"]; // María
echo $array["edad"];   // 29

6. Leer JSON desde un archivo

Supongamos que tenemos un archivo usuario.json con:

{
  "nombre": "Carlos",
  "edad": 40,
  "activo": true
}

Código PHP

<?php
$json = file_get_contents("usuario.json");

$datos = json_decode($json, true);

echo $datos["nombre"]; // Carlos

Referencia: file_get_contents.

7. Guardar JSON en un archivo

<?php
$producto = [
    "codigo" => 102,
    "descripcion" => "Monitor 24 pulgadas",
    "precio" => 1500.00,
    "disponible" => true
];

file_put_contents("producto.json", json_encode($producto, JSON_PRETTY_PRINT));

Esto genera un archivo producto.json:

{
    "codigo": 102,
    "descripcion": "Monitor 24 pulgadas",
    "precio": 1500,
    "disponible": true
}

Referencia: file_put_contents.

8. Manejo de errores

Si el JSON está mal formado, json_decode retorna null. Se puede usar json_last_error() y json_last_error_msg() para diagnosticar.

<?php
$json = "{nombre:'Ana'}"; // inválido (faltan comillas dobles)

$datos = json_decode($json);

if (json_last_error() !== JSON_ERROR_NONE) {
    echo "Error al parsear JSON: " . json_last_error_msg();
}

📊 Resumen

  • json_encode() — array/objeto PHP → string JSON.
  • json_decode() — string JSON → objeto PHP (por defecto) o array asociativo (true).
  • Soporta opciones (JSON_PRETTY_PRINT, JSON_UNESCAPED_UNICODE, etc.).
  • Funciona con archivos (file_get_contents / file_put_contents).
  • Siempre validar con json_last_error() para detectar errores.