Comparação de bibliotecas de análise e processamento JSON
Resumo: APIs nativas são mais rápidas, analisadores tolerantes dão offsets. Escolha por três coisas: localização de erros, se o texto original é preservado e se as fronteiras são explícitas.

Resumo da ópera: classifique primeiro a necessidade e depois compare implementações — use o JSON.parse nativo para valores somente leitura, jsonc-parser quando precisar de offsets ou tiver de preservar a formatação original, e adicione bibliotecas de consulta ou patch apenas onde forem necessárias; carregue bibliotecas grandes sob demanda por página e descarte as sem manutenção.
Toda biblioteca se diz "rápida, pequena e completa". O que realmente as diferencia é quanta informação elas conseguem dar quando algo dá errado.
1. Quatro categorias por finalidade
| Categoria | Bibliotecas representativas | O que resolve |
|---|---|---|
| Análise padrão | JSON.parse / JSON.stringify |
Sintaxe ↔ objeto, velocidade em primeiro lugar |
| Análise tolerante + edição | jsonc-parser, json5 |
Entrada com comentários, erros precisos no offset, modificações que preservam a formatação |
| Consulta | jsonpath-plus, jsonpath |
Selecionar nós por expressão |
| Mutação | fast-json-patch, immer |
Gerar/aplicar patches, atualizações imutáveis |
Identifique primeiro em qual categoria você está e depois compare implementações concretas — caso contrário é fácil usar uma biblioteca de consulta para fazer o trabalho de um analisador.
2. Comparação lado a lado
| Biblioteca | Localização de erros | Tolerância (comentários/vírgulas finais) | Preserva a formatação original | Cenários adequados |
|---|---|---|---|---|
JSON.parse |
Apenas mensagem e posição (depende da engine) | ✗ | ✗ | Análise padrão, dados de API |
jsonc-parser |
offset preciso + código de erro |
✓ | ✓ (modify + applyEdits) |
Editores, arquivos de configuração |
json5 |
Informação de linha e coluna | ✓ (mais leniente) | ✗ | Leitura de configuração JSON5 |
jsonlint |
Informação de linha e coluna | ✗ | ✗ | Apenas referência, não é mantido ativamente |
jsonpath-plus |
Erros de sintaxe de expressão | — | — | Consulta por expressão |
fast-json-patch |
Erros em nível de operação | — | — | Geração e aplicação de patch |
lz-string |
— | — | — | Compactar JSON em uma URL |
As mensagens de erro do JSON.parse variam muito entre engines. O V8 produz algo como
Unexpected token } in JSON at position 42, mas se a posição é precisa depende da versão da engine;
jsonc-parser em vez disso retorna um { error, offset, length } estruturado e estável, adequado para marcadores de editor.
3. Quatro pontos de decisão essenciais
3.1 Você precisa de offsets
Se você está construindo um editor e quer "clicar no erro para pular para a linha correspondente", precisa ter um offset. O teste é simples: se sua mensagem de erro só consegue imprimir "JSON inválido", os usuários terão de procurar por conta própria.
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)} no offset ${firstError.offset}`);
}
3.2 Você precisa preservar o texto original
Só ler valores → qualquer analisador serve. "Mudar um campo e manter todo o resto exatamente como estava" → você precisa usar uma API no estilo de edição, não "analisar → alterar o objeto → serializar".
O último perde: comentários, ordem das chaves (em algumas implementações), estilo de indentação, notação de literais numéricos (1e3 vira 1000) e formas de escape (\u4e2d vira o caractere real).
3.3 Os comportamentos de fronteira são explícitos
Antes de escolher uma biblioteca, verifique na documentação três coisas:
- Como as chaves duplicadas são tratadas (manter a última / gerar erro);
- Se inteiros grandes perdem precisão (a maioria das bibliotecas JS perde, porque todas passam por
Number); - O escopo suportado para BOM, comentários e vírgulas finais.
Se não houver documentação, escreva uma pequena amostra e teste você mesmo. Isso é mais confiável do que ler o README.
3.4 Estado de manutenção
O risco de uma biblioteca JSON não é falta de recursos, mas negligência de longo prazo: ninguém mais vai enviar patches de segurança (prototype pollution, ReDoS).
4. Comparação com outras linguagens
| Linguagem | Biblioteca padrão / principal | Diferença-chave |
|---|---|---|
| JavaScript | JSON.parse |
Todos os números são de precisão dupla |
| TypeScript | Igual ao acima + jsonc-parser / zod |
Tipos existem apenas em tempo de compilação |
| Go | encoding/json |
float64 por padrão, use UseNumber() para preservar precisão; json.RawMessage para análise adiada |
| Java | Jackson / Gson / Moshi | Com Jackson, cuidado com o risco de habilitar default typing |
| Python | json / orjson |
parse_float=Decimal preserva a precisão; orjson é mais rápido mas não suporta todos os tipos |
| Rust | serde_json |
Desserialização fortemente tipada; o recurso arbitrary_precision preserva a precisão |
| C++ | simdjson / RapidJSON | O simdjson mira throughput de análise, o RapidJSON é mais generalista |
Ao trocar dados entre linguagens, as coisas mais fáceis de tropeçar continuam sendo precisão numérica e formatos de hora; a escolha da biblioteca só consegue mitigá-las, não eliminá-las.
5. Combinações típicas
Opção 1: site de ferramentas (lado do navegador)
Análise e localização de erros: jsonc-parser
Editor: CodeMirror 6 + @codemirror/lang-json
Consulta: jsonpath-plus
Patch: fast-json-patch
Links de compartilhamento: lz-string
O traço definidor desta combinação é que tudo roda localmente e nenhum dado é enviado, o que corresponde às expectativas de privacidade de um site utilitário.
Opção 2: gateway de API do servidor
Validação: Ajv (compilar o schema uma vez, reutilizá-lo)
Análise: JSON.parse nativo (junto com um limite de tamanho de corpo)
Análise adiada de campos grandes: guardar a string crua, analisar só quando necessário
Não introduza bibliotecas de consulta/patch na camada de gateway para implementar lógica de negócio — esse é o trabalho da camada de negócio.
Opção 3: CLI e scripts
Selecionar campos: jq
Conversão de formato: yq / dasel
Navegação interativa: jless
Validação em lote: ajv-cli
6. O impacto real do tamanho do bundle e do desempenho
jsonc-parseré muito pequeno e adequado ao bundle principal;json5é um pouco maior quejsonc-parserporque suporta mais sintaxe;jsonpath-plusinclui avaliação de expressões e é notavelmente maior, então deve ser carregado sob demanda por página;fast-json-patchtem tamanho médio e só é necessário quando há um recurso de comparação.
A otimização é direta: importe dinamicamente por página e não os coloque no chunk da primeira tela.
const { JSONPath } = await import('jsonpath-plus');
7. Lista de verificação
- [ ] Escolha bibliotecas por finalidade; não use uma biblioteca de consulta para analisar;
- [ ] Use
jsonc-parserquando precisar de localizações de erro precisas; - [ ] Use APIs no estilo de edição quando comentários e formatação precisarem ser preservados;
- [ ] Teste na prática os três comportamentos de fronteira: chaves duplicadas, inteiros grandes e BOM;
- [ ] Acompanhe o estado de manutenção e os avisos de segurança da biblioteca;
- [ ] Importe dinamicamente bibliotecas grandes sob demanda.
Perguntas frequentes
Como escolho uma biblioteca JSON conforme o tamanho do meu projeto?
Ferramentas pequenas que só leem dados de API podem continuar com o JSON.parse nativo. Projetos que precisam de localização de erros no nível de editor ou que precisam preservar a formatação original devem usar jsonc-parser. Um gateway de servidor precisa apenas de validação e análise, deixando bibliotecas de consulta e patch para a camada de negócio, enquanto scripts de CLI podem usar jq, yq e ajv-cli diretamente.
Por que o estado de manutenção importa mais do que a quantidade de recursos?
O risco real de uma biblioteca JSON é a negligência de longo prazo, não recursos faltando: ninguém vai enviar patches de segurança para prototype pollution ou ReDoS. Por mais completa que seja a lista de recursos, uma biblioteca parada deixa você mesmo a remendar. Trate manutenção e avisos de segurança como critérios rígidos em vez de comparar tabelas de recursos.
Devo usar JSON.parse para mudar um campo e manter comentários e indentação?
Não. Analisar, alterar o objeto e depois serializar perde comentários, ordem das chaves, estilo de indentação, notação de literais numéricos (1e3 vira 1000) e formas de escape (\u4e2d vira o caractere real). Mudar um campo mantendo todo o resto intacto exige uma API no estilo de edição, como modify e applyEdits do jsonc-parser.