Introducción: por qué el JSON "sucio" es enemigo de cualquier desarrollador
\n\nImagine: está escribiendo una API en PHP, devuelve datos en formato JSON, abre el resultado en el navegador o la consola — y ve una sola línea continua sin un solo espacio:
\n\n{"users":[{"id":1,"name":"Иван","email":"ivan@example.com"},{"id":2,"name":"Мария","email":"maria@example.com"}]}\n\nLos ojos se pierden, es imposible encontrar el campo necesario, y si el JSON contiene un error — lo buscará durante horas. ¿Le suena familiar? Por eso en Stack Overflow la pregunta "Pretty-Printing JSON with PHP" ha acumulado miles de visitas. Hoy vamos a entender de una vez por todas cómo hacer que el JSON sea legible, estructurado y bonito con PHP.
\n\nEn este artículo aprenderá:
\n- \n
- Qué es pretty-printing y para qué sirve \n
- Cómo usar la función incorporada
json_encodecon banderas \n - Cómo formatear JSON para depuración, registros y salida en el navegador \n
- Técnicas adicionales: formateo recursivo, trabajo con Unicode y compresión \n
¡Allá vamos!
\n\n¿Qué es pretty-printing JSON?
\n\nPretty-printing (del inglés "impresión bonita") es el formateo de datos con sangrías, saltos de línea y alineación, para que una persona pueda leer fácilmente la estructura. En el caso de JSON, esto convierte un "batiburrillo" en una jerarquía ordenada:
\n\n{\n "users": [\n {\n "id": 1,\n "name": "Иван",\n "email": "ivan@example.com"\n },\n {\n "id": 2,\n "name": "Мария",\n "email": "maria@example.com"\n }\n ]\n}\n\n¡Reconozca que es mucho más agradable trabajar así! PHP proporciona herramientas incorporadas para esto, que no requieren instalar bibliotecas adicionales.
\n\nMétodo principal: json_encode con la bandera JSON_PRETTY_PRINT
\n\nEl método más simple y común es usar el segundo parámetro de la función json_encode(), pasando la constante JSON_PRETTY_PRINT. Aquí tiene un ejemplo básico:
<?php\n$data = [\n 'name' => 'PythonLib',\n 'type' => 'educational',\n 'topics' => ['PHP', 'Python', 'JavaScript'],\n 'stats' => [\n 'visitors' => 15000,\n 'rating' => 4.8\n ]\n];\n\n$prettyJson = json_encode($data, JSON_PRETTY_PRINT);\necho $prettyJson;\n?>\n\nResultado:
\n\n{\n "name": "PythonLib",\n "type": "educational",\n "topics": [\n "PHP",\n "Python",\n "JavaScript"\n ],\n "stats": {\n "visitors": 15000,\n "rating": 4.8\n }\n}\n\nTenga en cuenta: las claves se ordenan alfabéticamente. Si necesita conservar el orden original, use la bandera JSON_PRESERVE_ZERO_FRACTION (para números de punto flotante) u ordene el array manualmente.
Combinación de banderas
\n\nPuede pasar varias banderas usando | (OR bit a bit). Por ejemplo, para formatear y escapar caracteres Unicode simultáneamente:
$json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);\necho $json;\n\nLa bandera JSON_UNESCAPED_UNICODE conserva los caracteres cirílicos y otros en forma legible, en lugar de como \\u0438\\u0432\\u0430\\u043d. Esto es especialmente útil para sitios en español y otros idiomas.
Cómo mostrar pretty-printed JSON en el navegador
\n\nSi está desarrollando una API y desea que el JSON se muestre bonito directamente en el navegador (por ejemplo, durante la depuración), use la cabecera Content-Type: application/json junto con el formateo:
<?php\nheader('Content-Type: application/json; charset=utf-8');\n\n$response = [\n 'status' => 'success',\n 'data' => [\n 'message' => '¡Hola, mundo!',\n 'code' => 200\n ]\n];\n\necho