Comparación de bibliotecas de análisis y procesamiento de JSON
En resumen: Las APIs nativas son las más rápidas; los parsers tolerantes dan offsets. Elige por tres cosas: la localización del error, si se conserva el texto original y si los límites están explícitos.

En resumen: clasifica primero la necesidad y luego compara implementaciones — usa JSON.parse nativo para valores de solo lectura, jsonc-parser cuando necesites offsets o debas conservar el formato original, y añade bibliotecas de consulta o de parches solo donde haga falta; carga las bibliotecas grandes por página bajo demanda y descarta las que no tengan mantenimiento.
Todas las bibliotecas afirman ser "rápidas, pequeñas y completas". Lo que realmente las distingue es cuánta información te dan cuando algo sale mal.
1. Cuatro categorías por propósito
| Categoría | Bibliotecas representativas | Qué resuelve |
|---|---|---|
| Parseo estándar | JSON.parse / JSON.stringify |
Sintaxis ↔ objeto, velocidad ante todo |
| Parseo tolerante + edición | jsonc-parser, json5 |
Entrada con comentarios, errores precisos hasta el offset, modificaciones que conservan el formato |
| Consulta | jsonpath-plus, jsonpath |
Seleccionar nodos mediante una expresión |
| Mutación | fast-json-patch, immer |
Generar/aplicar parches, actualizaciones inmutables |
Identifica primero en qué categoría estás y luego compara implementaciones concretas; de lo contrario es fácil usar una biblioteca de consulta para hacer el trabajo de un parser.
2. Comparación lado a lado
| Biblioteca | Localización del error | Tolerancia (comentarios/comas finales) | Conserva el formato original | Escenarios adecuados |
|---|---|---|---|---|
JSON.parse |
Solo mensaje y posición (según el motor) | ✗ | ✗ | Parseo predeterminado, datos de API |
jsonc-parser |
offset preciso + código de error |
✓ | ✓ (modify + applyEdits) |
Editores, archivos de configuración |
json5 |
Información de línea y columna | ✓ (más permisivo) | ✗ | Leer configuración JSON5 |
jsonlint |
Información de línea y columna | ✗ | ✗ | Solo como referencia, sin mantenimiento activo |
jsonpath-plus |
Errores de sintaxis de la expresión | — | — | Consultar mediante una expresión |
fast-json-patch |
Errores a nivel de operación | — | — | Generación y aplicación de parches |
lz-string |
— | — | — | Comprimir JSON dentro de una URL |
Los mensajes de error de JSON.parse varían mucho entre motores. V8 produce algo como
Unexpected token } in JSON at position 42, pero que la posición sea exacta depende de la versión del motor;
jsonc-parser, en cambio, devuelve un { error, offset, length } estructurado y estable, adecuado para marcadores de editor.
3. Cuatro puntos clave de decisión
3.1 ¿Necesitas offsets
Si estás construyendo un editor y quieres "haz clic en el error para saltar a la línea correspondiente", necesitas un offset. La prueba es simple: si tu mensaje de error solo puede imprimir "invalid JSON", los usuarios tendrán que buscarlo ellos mismos.
import { parse, printParseErrorCode } from 'jsonc-parser';
const errors: Array<{ error: number; offset: number; length: number }> = [];
parse(text, errors, { allowTrailingComma: true, disallowComments: false });
if (errors.length > 0) {
const firstError = errors[0];
console.error(`${printParseErrorCode(firstError.error)} at offset ${firstError.offset}`);
}
3.2 ¿Necesitas conservar el texto original
Solo leer valores → cualquier parser sirve. "Cambiar un campo y mantener todo lo demás exactamente como estaba" → debes usar una API de edición, no "parsear → cambiar el objeto → serializar".
Esto último pierde: comentarios, orden de claves (en algunas implementaciones), estilo de indentación, notación de literales numéricos (1e3 se convierte en 1000) y formas de escape (\u4e2d se convierte en el carácter real).
3.3 ¿Están explícitos los comportamientos límite
Antes de elegir una biblioteca, revisa la documentación en busca de tres cosas:
- Cómo se manejan las claves duplicadas (conservar la última / lanzar un error);
- Si los enteros grandes pierden precisión (la mayoría de las bibliotecas JS sí, porque todas pasan por
Number); - El alcance soportado para BOM, comentarios y comas finales.
Si no hay documentación, escribe una pequeña muestra y pruébala tú mismo. Eso es más fiable que leer el README.
3.4 Estado de mantenimiento
El riesgo de una biblioteca JSON no es que le falten funciones, sino el abandono prolongado: ya nadie publicará parches de seguridad (contaminación de prototipos, ReDoS).
4. Comparación con otros lenguajes
| Lenguaje | Biblioteca estándar / principal | Diferencia clave |
|---|---|---|
| JavaScript | JSON.parse |
Todos los números son de doble precisión |
| TypeScript | Igual que arriba + jsonc-parser / zod |
Los tipos existen solo en tiempo de compilación |
| Go | encoding/json |
float64 por defecto, usa UseNumber() para conservar la precisión; json.RawMessage para parseo diferido |
| Java | Jackson / Gson / Moshi | Con Jackson, cuidado con el riesgo de habilitar el tipado por defecto |
| Python | json / orjson |
parse_float=Decimal conserva la precisión; orjson es más rápido pero no soporta todos los tipos |
| Rust | serde_json |
Deserialización fuertemente tipada; la feature arbitrary_precision conserva la precisión |
| C++ | simdjson / RapidJSON | simdjson apunta al rendimiento del parseo, RapidJSON es más generalista |
Al intercambiar datos entre lenguajes, lo más fácil de tropezar siguen siendo la precisión numérica y los formatos de hora; elegir biblioteca solo puede mitigarlo, no eliminarlo.
5. Combinaciones típicas
Opción 1: Sitio de herramientas (lado navegador)
Parsing and error location: jsonc-parser
Editor: CodeMirror 6 + @codemirror/lang-json
Query: jsonpath-plus
Patch: fast-json-patch
Share links: lz-string
El rasgo distintivo de esta combinación es que todo se ejecuta localmente y no se sube ningún dato, lo que encaja con las expectativas de privacidad de un sitio de herramientas.
Opción 2: Gateway de API en el servidor
Validation: Ajv (compile the schema once, reuse it)
Parsing: native JSON.parse (together with a body size limit)
Deferred parsing of large fields: keep the raw string, parse only when needed
No introduzcas bibliotecas de consulta o de parches en la capa de gateway para implementar lógica de negocio; eso es trabajo de la capa de negocio.
Opción 3: CLI y scripts
Pick fields: jq
Format conversion: yq / dasel
Interactive browsing: jless
Batch validation: ajv-cli
6. El impacto real del tamaño del bundle y el rendimiento
jsonc-parseres muy pequeño y adecuado para el bundle principal;json5es algo más grande quejsonc-parserporque soporta más sintaxis;jsonpath-plusincluye evaluación de expresiones y es notablemente más grande, así que debe cargarse por página bajo demanda;fast-json-patches de tamaño medio y solo se necesita cuando tienes una función de comparación.
La optimización es directa: importación dinámica por página, y no los pongas en el chunk de la primera pantalla.
const { JSONPath } = await import('jsonpath-plus');
7. Lista de comprobación
- [ ] Elegir bibliotecas por propósito; no usar una biblioteca de consulta para parsear;
- [ ] Usar
jsonc-parsercuando necesites localizaciones de error precisas; - [ ] Usar APIs de edición cuando haya que conservar comentarios y formato;
- [ ] Probar en la práctica los tres comportamientos límite: claves duplicadas, enteros grandes y BOM;
- [ ] Vigilar el estado de mantenimiento de la biblioteca y sus avisos de seguridad;
- [ ] Importar dinámicamente las bibliotecas grandes bajo demanda.
FAQ
¿Cómo elijo una biblioteca JSON según el tamaño de mi proyecto?
Las herramientas pequeñas que solo leen datos de API pueden quedarse con JSON.parse nativo. Los proyectos que necesitan localizaciones de error de nivel editor o que deben conservar el formato original deberían usar jsonc-parser. Un gateway en el servidor solo necesita validación y parseo, dejando las bibliotecas de consulta y parches a la capa de negocio, mientras que los scripts de CLI pueden usar jq, yq y ajv-cli directamente.
¿Por qué importa más el estado de mantenimiento que el número de funciones?
El riesgo real de una biblioteca JSON es el abandono prolongado, no que le falten funciones: nadie publicará parches de seguridad para contaminación de prototipos o ReDoS. Por completa que sea la lista de funciones, una biblioteca estancada te deja parchearla tú mismo. Trata el mantenimiento y los avisos de seguridad como criterios duros en lugar de comparar tablas de funciones.
¿Debo usar JSON.parse para cambiar un campo y conservar comentarios e indentación?
No. Parsear, cambiar el objeto y luego serializar pierde comentarios, orden de claves, estilo de indentación, notación de literales numéricos (1e3 se convierte en 1000) y formas de escape (\u4e2d se convierte en el carácter real). Cambiar un campo manteniendo todo lo demás intacto requiere una API de edición como modify y applyEdits de jsonc-parser.