← Volver al Blog

Errores Comunes JSON y Cómo Solucionarlos: Guía de Debugging

Aprende a identificar y resolver los errores JSON más comunes. Incluye ejemplos prácticos de debugging y mejores prácticas de validación.

Big JSON Team12 min de lecturaGuías
B

Big JSON Team

Technical Writer

Expert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.

12 min lectura

# Errores Comunes JSON y Cómo Solucionarlos: Guía de Debugging

Trabajar con JSON puede ser frustrante cuando aparecen errores crípticos. Esta guía completa te ayudará a identificar, entender y resolver los errores JSON más comunes.

Errores de Sintaxis

1. Comas Finales (Trailing Commas)

Error:
{

"nombre": "Ana",

"edad": 28, ← Error: coma final

}

Mensaje de Error:
Unexpected token } in JSON at position 32

SyntaxError: Unexpected token } in JSON

Solución:
{

"nombre": "Ana",

"edad": 28

}

Consejo: JSON no permite comas después del último elemento, a diferencia de JavaScript.

2. Comillas Simples

Error:
{

'nombre': 'Ana',

'edad': 28

}

Mensaje de Error:
Unexpected token ' in JSON at position 2
Solución:
{

"nombre": "Ana",

"edad": 28

}

Consejo: JSON requiere comillas dobles, no simples.

3. Claves Sin Comillas

Error:
{

nombre: "Ana",

edad: 28

}

Mensaje de Error:
Unexpected token n in JSON at position 2
Solución:
{

"nombre": "Ana",

"edad": 28

}

4. Comentarios

Error:
{

// Este es un comentario

"nombre": "Ana",

"edad": 28

}

Mensaje de Error:
Unexpected token / in JSON at position 2
Solución:
{

"nombre": "Ana",

"edad": 28

}

Nota: JSON no admite comentarios. Usa JSONC (JSON with Comments) si los necesitas.

5. Valores No Entrecomillados

Error:
{

"nombre": Ana,

"edad": 28

}

Mensaje de Error:
Unexpected token A in JSON at position 11
Solución:
{

"nombre": "Ana",

"edad": 28

}

6. Números con Ceros a la Izquierda

Error:
{

"codigo": 007

}

Mensaje de Error:
Unexpected number in JSON at position 13
Solución:
{

"codigo": 7

}

// O como string si necesitas el cero:

{

"codigo": "007"

}

7. Falta de Comas

Error:
{

"nombre": "Ana"

"edad": 28

}

Mensaje de Error:
Unexpected string in JSON at position 18
Solución:
{

"nombre": "Ana",

"edad": 28

}

Errores de Estructura

8. Arrays con Valores Heterogéneos Mal Formateados

Error:
{

"valores": [1, 2, "tres" 4, 5]

}

Mensaje de Error:
Unexpected number in JSON at position 28
Solución:
{

"valores": [1, 2, "tres", 4, 5]

}

9. Objetos Anidados Mal Cerrados

Error:
{

"usuario": {

"nombre": "Ana",

"contacto": {

"email": "ana@ejemplo.com"

}

}

Mensaje de Error:
Unexpected token } in JSON at position 78
Solución:
{

"usuario": {

"nombre": "Ana",

"contacto": {

"email": "ana@ejemplo.com"

}

}

}

10. Valores Undefined

Error:
{

"nombre": "Ana",

"telefono": undefined

}

Mensaje de Error:
Unexpected token u in JSON at position 28
Solución:
{

"nombre": "Ana",

"telefono": null

}

// O simplemente omitir la propiedad:

{

"nombre": "Ana"

}

Errores de Codificación

11. Caracteres de Control

Error:
{

"texto": "Línea 1

Línea 2"

}

Mensaje de Error:
Unexpected token in JSON at position 22
Solución:
{

"texto": "Línea 1\nLínea 2"

}

Caracteres que necesitan escape:
  • \n - Nueva línea
  • \r - Retorno de carro
  • \t - Tabulación
  • \" - Comillas dobles
  • \\ - Barra invertida

12. Comillas Sin Escapar

Error:
{

"cita": "Ella dijo "Hola""

}

Mensaje de Error:
Unexpected token H in JSON at position 19
Solución:
{

"cita": "Ella dijo \"Hola\""

}

13. Encoding UTF-8 Inválido

Error:

El archivo tiene BOM (Byte Order Mark) o codificación incorrecta.

Solución:
# Convertir a UTF-8 sin BOM

iconv -f UTF-8 -t UTF-8 -c archivo.json > archivo_limpio.json

# O en VS Code:

# 1. Abrir archivo

# 2. Clic en encoding (esquina inferior derecha)

# 3. Seleccionar "Save with Encoding"

# 4. Elegir "UTF-8"

Errores en JavaScript/TypeScript

14. JSON.parse() con String Vacío

Error:
const datos = JSON.parse("");
Mensaje de Error:
SyntaxError: Unexpected end of JSON input
Solución:
const jsonString = "";

let datos;

try {

datos = jsonString ? JSON.parse(jsonString) : {};

} catch (error) {

console.error("JSON inválido:", error.message);

datos = {};

}

15. JSON.parse() con Undefined o Null

Error:
const datos = JSON.parse(undefined);
Mensaje de Error:
SyntaxError: Unexpected token u in JSON at position 0
Solución:
function parsearJSON(str) {

if (str === null || str === undefined) {

return null;

}

try {

return JSON.parse(str);

} catch (error) {

console.error("Error parseando JSON:", error.message);

return null;

}

}

16. Circular References en JSON.stringify()

Error:
const obj = { nombre: "Ana" };

obj.self = obj; // Referencia circular

JSON.stringify(obj);

Mensaje de Error:
TypeError: Converting circular structure to JSON
Solución:
// Opción 1: Usar replacer

const visto = new WeakSet();

const json = JSON.stringify(obj, (key, value) => {

if (typeof value === "object" && value !== null) {

if (visto.has(value)) {

return "[Circular]";

}

visto.add(value);

}

return value;

});

// Opción 2: Usar biblioteca

import { stringify } from 'circular-json';

const json = stringify(obj);

17. Funciones y Símbolos en JSON.stringify()

Error:
const obj = {

nombre: "Ana",

saludar: function() { console.log("Hola"); },

id: Symbol('id')

};

console.log(JSON.stringify(obj));

// {"nombre":"Ana"} - función y símbolo ignorados

Solución:
const obj = {

nombre: "Ana",

saludar: "function() { console.log('Hola'); }",

id: "symbol-id"

};

// O usar replacer personalizado

const json = JSON.stringify(obj, (key, value) => {

if (typeof value === 'function') {

return value.toString();

}

if (typeof value === 'symbol') {

return value.toString();

}

return value;

});

Errores en Validación de Datos

18. Tipo de Dato Incorrecto

Error:
// API devuelve string pero esperamos número

const usuario = {

id: "123", // String en vez de número

edad: "28" // String en vez de número

};

Solución:
// Validación y conversión

function validarUsuario(datos) {

return {

id: parseInt(datos.id, 10),

edad: parseInt(datos.edad, 10)

};

}

// O usar Zod para validación

import { z } from 'zod';

const UsuarioSchema = z.object({

id: z.number(),

edad: z.number()

});

// Esto lanzará error si tipos no coinciden

const usuario = UsuarioSchema.parse(datos);

19. Propiedades Faltantes

Error:
const usuario = {

nombre: "Ana"

// falta email

};

console.log(usuario.email.toLowerCase()); // TypeError

Solución:
// Verificar existencia

if (usuario.email) {

console.log(usuario.email.toLowerCase());

}

// Operador opcional chaining

console.log(usuario.email?.toLowerCase());

// Valor por defecto

const email = usuario.email ?? "sin-email@ejemplo.com";

// Validación con Zod

const UsuarioSchema = z.object({

nombre: z.string(),

email: z.string().email()

});

try {

const usuarioValido = UsuarioSchema.parse(usuario);

} catch (error) {

console.error("Usuario inválido:", error.errors);

}

Herramientas de Debugging

JSONLint

URL: jsonlint.com
// Pegar JSON y validar

// Muestra exactamente dónde está el error

Big JSON Viewer

URL: bigjson.online Características:
✓ Detecta errores de sintaxis

✓ Muestra línea exacta del error

✓ Formatea automáticamente

✓ Funciona con archivos grandes

jq en Línea de Comandos

# Validar sintaxis JSON

jq . archivo.json

# Si hay error, muestra la línea exacta

jq . datos.json

# parse error: Expected separator between values at line 5, column 12

VS Code

Configuración:
{

"json.validate.enable": true,

"json.format.enable": true

}

Atajos:
  • Ctrl + Shift + P → "Format Document"
  • Ver errores en panel "Problemas"

Node.js Script de Validación

const fs = require('fs');

function validarJSON(archivo) {

try {

const contenido = fs.readFileSync(archivo, 'utf-8');

JSON.parse(contenido);

console.log(✓ ${archivo} es JSON válido);

return true;

} catch (error) {

console.error(✗ Error en ${archivo}:);

console.error( Línea: ${error.message});

// Mostrar línea problemática

const lineas = contenido.split('\n');

const numeroLinea = extraerNumeroLinea(error.message);

if (numeroLinea) {

console.error( ${lineas[numeroLinea - 1]});

}

return false;

}

}

function extraerNumeroLinea(mensaje) {

const match = mensaje.match(/line (\d+)/);

return match ? parseInt(match[1]) : null;

}

// Validar múltiples archivos

const archivos = ['datos1.json', 'datos2.json'];

archivos.forEach(validarJSON);

Mejores Prácticas para Prevenir Errores

1. Usa un Linter

# ESLint para archivos .json

npm install --save-dev eslint eslint-plugin-json

# .eslintrc.js

module.exports = {

plugins: ['json'],

overrides: [

{

files: ['.json'],

extends: ['plugin:json/recommended']

}

]

};

2. Validación en Desarrollo

// Modo desarrollo: validación estricta

if (process.env.NODE_ENV === 'development') {

const validarDatos = (datos) => {

// Validación exhaustiva

if (!datos.id || typeof datos.id !== 'number') {

throw new Error('ID inválido');

}

// ... más validaciones

};

}

3. Try-Catch en Producción

async function obtenerDatos() {

try {

const respuesta = await fetch('/api/datos');

const datos = await respuesta.json();

// Validar estructura básica

if (!datos || typeof datos !== 'object') {

throw new Error('Formato de datos inválido');

}

return datos;

} catch (error) {

console.error('Error obteniendo datos:', error);

// Devolver datos por defecto o reintenta

return { error: true, mensaje: error.message };

}

}

4. Schema Validation

import Ajv from 'ajv';

const ajv = new Ajv();

const schema = {

type: 'object',

properties: {

nombre: { type: 'string' },

edad: { type: 'number', minimum: 0 },

email: { type: 'string', format: 'email' }

},

required: ['nombre', 'email']

};

const validate = ajv.compile(schema);

const datos = {

nombre: "Ana",

email: "ana@ejemplo.com",

edad: 28

};

if (validate(datos)) {

console.log('✓ Datos válidos');

} else {

console.error('✗ Errores:', validate.errors);

}

5. Tests Automatizados

// test/json-validation.test.js

import { describe, it, expect } from 'vitest';

import fs from 'fs';

describe('Validación de archivos JSON', () => {

it('config.json debe ser válido', () => {

const contenido = fs.readFileSync('./config.json', 'utf-8');

expect(() => JSON.parse(contenido)).not.toThrow();

});

it('datos.json debe tener estructura correcta', () => {

const contenido = fs.readFileSync('./datos.json', 'utf-8');

const datos = JSON.parse(contenido);

expect(datos).toHaveProperty('usuarios');

expect(Array.isArray(datos.usuarios)).toBe(true);

});

});

Debugging Avanzado

Inspeccionar JSON Grande

// Streaming para archivos muy grandes

const fs = require('fs');

const JSONStream = require('JSONStream');

fs.createReadStream('datos_grandes.json')

.pipe(JSONStream.parse('usuarios.'))

.on('data', (usuario) => {

// Procesar cada usuario individualmente

console.log(usuario);

})

.on('error', (error) => {

console.error('Error:', error);

});

Pretty Print para Debugging

// Formatear JSON para lectura fácil

console.log(JSON.stringify(datos, null, 2));

// Con colores en Node.js

console.dir(datos, { depth: null, colors: true });

// Mostrar solo ciertas propiedades

console.log(JSON.stringify(datos, ['nombre', 'email'], 2));

Comparar JSON

import { diff } from 'deep-object-diff';

const original = { nombre: "Ana", edad: 28 };

const actualizado = { nombre: "Ana", edad: 29, ciudad: "Madrid" };

const diferencias = diff(original, actualizado);

console.log(diferencias);

// { edad: 29, ciudad: "Madrid" }

Conclusión

La mayoría de errores JSON son sintácticos y fáciles de resolver una vez identificados. Usar herramientas de validación, linters y schemas puede prevenir muchos problemas.

Checklist de Debugging

  • ✓ Verifica comillas dobles (no simples)
  • ✓ Revisa comas finales
  • ✓ Asegura que las claves tengan comillas
  • ✓ Valida estructura de llaves/corchetes
  • ✓ Escapa caracteres especiales
  • ✓ Usa herramientas como JSONLint o Big JSON Viewer
  • ✓ Implementa validación en runtime
  • ✓ Escribe tests para datos críticos

¡Debugging feliz con JSON!

Share:

Artículos Relacionados

Read in English