Pular para o conteúdo principal

JSON5 vs JSON

O rigor do JSON é a funcionalidade: a RFC 8259 é o motivo de todo parser do planeta concordar. O JSON5 troca parte dessa universalidade por conforto humano — comentários, chaves sem aspas, aspas simples, vírgulas finais, números hexadecimais. Mantenha JSON para tudo que um programa lê; permita JSON5 apenas em arquivos de configuração que todo consumidor faça o parse com a mesma biblioteca.

Só local

JSON5 vs JSON: explicação

Todo arquivo JSON que já irritou uma pessoa o faz do mesmo jeito: você não consegue explicar por que um campo existe, não consegue desabilitar temporariamente um bloco, e remover a última vírgula é um trabalhão que o parser poderia perdoar. O JSON5 é a resposta da comunidade — um superconjunto estrito do JSON, modelado na sintaxe do ECMAScript 5, que adiciona comentários, relaxa as aspas e tolera vírgulas finais, além de algumas conveniências numéricas. JSON válido é sempre JSON5 válido; o inverso nunca é verdade.

A especificação vive em json5.org e não em nenhum documento da IETF, e essa posição é o resumo honesto da troca. A gramática da RFC 8259 é o que garante que um payload escrito em Tóquio faça parse de modo idêntico em Toronto — uma página de regras, sem dialetos. O JSON5 reintroduz a pergunta que o JSON estrito nunca faz: qual parser, e qual versão dele? Os navegadores trazem o JSON.parse e nada mais, então JSON5 sempre significa uma dependência.

Por isso, na prática, a divisão é limpa: JSON para a transmissão e tudo que é armazenado, JSON5 para configuração mantida por pessoas, onde uma dependência de parser é um custo único e os comentários se pagam. Esta página percorre o que o JSON5 adiciona, o que custa e onde fica a linha — com as ferramentas JSON locais do site prontas para conferir qualquer um dos lados.

Quer saber onde seu arquivo fica na linha do rigor? O Validador de JSON faz o parse conforme a RFC 8259 localmente e sinaliza o primeiro constructo que um parser estrito rejeita.

Para arquivos já dentro do subconjunto estrito, o Formatador de JSON normaliza aspas, chaves e indentação no seu navegador — nada é enviado.

O que o JSON5 realmente adiciona

As extensões do JSON5 vêm todas da sintaxe de literais de objeto do ES5 — o lugar de onde o JSON veio originalmente. Os comentários voltam, como // até o fim da linha e /* block */. As chaves podem ficar sem aspas quando são identificadores válidos. As strings podem usar aspas simples e mais escapes. Os números ganham hexadecimal, ponto decimal à esquerda ou à direita, sinal de mais à esquerda e os valores especiais Infinity, -Infinity e NaN. Vírgulas finais são permitidas nos dois contêineres.

RecursoJSON (RFC 8259)JSON5
ComentáriosNenhum — removidos de propósito// e /* */ permitidos
Chaves de objetoApenas strings entre aspas duplasIdentificadores válidos sem aspas
Aspas de stringApenas aspas duplasSimples ou duplas
Vírgulas finaisErro de sintaxePermitidas
NúmerosApenas decimal, sem + à esquerdaHex, +.5, 5., Infinity, NaN
PadrãoRFC 8259 / ECMA-404spec do json5.org, definida por biblioteca

O custo: quem consegue ler o arquivo

O JSON.parse rejeita o primeiro comentário, aspa simples ou chave sem aspas que encontrar — não existe JSON5 nativo de navegador nem plataforma de servidor que o traga. Por isso, todo consumidor precisa da mesma biblioteca, fixada em comportamento compatível. No instante em que um documento deixa de ser JSON estrito, “qualquer parser serve” deixa de ser verdade — e essa garantia é o principal que a RFC 8259 comprava.

Um custo mais sutil é o zoológico de dialetos crescendo na lacuna: JSONC — apenas comentários e vírgulas finais — é o que o tsconfig e o VS Code realmente aceitam, e não é JSON5, já que o JSONC mantém aspas e números estritos. Arquivos derivam entre dialetos, editores discordam do realce, e um upgrade da cadeia de ferramentas pode transformar um constructo tolerado em erro. O JSON estrito não tem essa ambiguidade para administrar.

Onde cada um se encaixa

A divisão segue o leitor. Configuração escrita e revisada por pessoas se beneficia de comentários que explicam um campo, opções comentadas durante o debug e chaves sem aspas que reduzem ruído — esse é o território do JSON5, onde quer que a cadeia de ferramentas já o suporte. Tudo que um programa emite ou consome — payloads de API, estado armazenado, logs estruturados, mensagens de fila — permanece JSON estrito, onde a universalidade é o ponto principal.

  • Formato de transmissão: JSON, sempre — qualquer consumidor precisa fazer o parse com zero configuração compartilhada.
  • Configuração mantida por pessoas: JSON5 ou JSONC, se suas ferramentas já falam isso nativamente.
  • Schema e documentação: o JSON estrito empurra a explicação para os schemas, porque comentários não têm onde viver.
  • Dados em repouso: JSON — seus futuros leitores incluem ferramentas que ainda não foram escolhidas.

Convertendo entre eles

De JSON para JSON5 é de graça: JSON estrito já faz parse como JSON5, então “converter” é questão de estilo, não de estrutura. De JSON5 para JSON há perdas exatamente nos pontos que você esperaria: comentários não têm destino e desaparecem, e Infinity, -Infinity e NaN não têm valor em JSON, então viram null ou strings. Todo o resto sobrevive: chaves ganham aspas, aspas se normalizam, números hexadecimais chegam como o mesmo valor em decimal.

Você pode ver a fronteira com seus próprios olhos: cole um arquivo JSON5 em um validador estrito e o primeiro erro aponta o constructo que a cruzou — um comentário, uma aspa, uma vírgula final. O diagnóstico funciona no outro sentido também: se um arquivo de configuração precisará um dia ser lido por ferramentas estritas, mantenha-o dentro do subconjunto estrito desde o primeiro dia, porque fazer downgrade é a viagem com perdas.

Quando escolher cada um

Fique com JSON por padrão e recorra ao JSON5 apenas com um motivo. O motivo é um arquivo que pessoas mantêm e máquinas apenas consomem — configuração de build, feature flags, definições de ambiente — combinado com uma cadeia de ferramentas que já faz o parse de JSON5 nativamente. Se seus consumidores são desconhecidos, externos ou de longa vida, o rigor não é burocracia; é o contrato da interface.

A orientação se inverte com clareza: um arquivo de configuração que nunca precisou de um comentário também não precisa de JSON5, e um arquivo JSON5 que um serviço passou a fazer parse em tempo de execução virou discretamente um formato de transmissão — o que significa que ele quer ser JSON de novo.

Perguntas frequentes

Posso formatar ou validar JSON aqui sem enviar o arquivo?

Sim. O formatador e o validador rodam inteiramente na aba do seu navegador — o parse usa o próprio motor JSON do navegador conforme a RFC 8259, nenhuma requisição sai da página, a Content-Security-Policy do site bloqueia chamadas de saída, e o painel Network do DevTools fica em silêncio. Arquivos de configuração nunca saem da sua máquina. JSON estrito valida; extensões do JSON5 aparecem como erros de sintaxe que nomeiam o constructo exato.

JSON5 é um padrão oficial?

Não no sentido de RFC. Ele é especificado em json5.org e ancorado por sua implementação de referência e comunidade, enquanto o JSON tem a RFC 8259 e a ECMA-404. Na prática, isso significa que não há linguagem de conformidade, nem registro, e a interoperabilidade só é garantida compartilhando o mesmo parser — o oposto da promessa do JSON de que qualquer parser serve.

Por que o JSON não suporta comentários?

Douglas Crockford os removeu de propósito ao padronizar o formato: fornecedores haviam começado a embutir diretivas de parse dentro de comentários, o que quebrava a interoperabilidade entre implementações. Um formato de intercâmbio de dados precisa significar a mesma coisa para todo leitor, então a gramática ficou mínima. As convenções que sobrevivem são chaves irmãs como "_comment", ou JSONC onde a cadeia de ferramentas permite.

O JSON.parse consegue lidar com JSON5?

Não — ele lança erro no primeiro comentário, aspa simples, chave sem aspas ou vírgula final, o que já derruba a maioria dos arquivos JSON5 reais de cara. Você precisa da biblioteca JSON5 ou reescrever para JSON estrito primeiro. Cuidado também com a armadilha do JSONC: um parser que aceita comentários e vírgulas finais ainda não é um parser JSON5, e ele vai rejeitar aspas simples e números hexadecimais.

Converter JSON5 para JSON perde dados?

Os comentários — eles não têm representação legal em JSON, então qualquer conversor os descarta por design. Infinity, -Infinity e NaN perdem seus valores, virando null ou strings dependendo do conversor. Todo o resto sobrevive: chaves sem aspas ganham aspas, aspas simples viram duplas, números hexadecimais chegam como o mesmo valor em decimal. Se os comentários importam, o arquivo deve ficar onde comentários são legais.

Minha configuração deve ser JSON5 ou YAML?

Se sua cadeia de ferramentas já fala JSON5, fique — migrar custa mais do que os comentários valem. Começando do zero, YAML é o formato de configuração humana mais testado em batalha, com escalares em bloco, âncoras para reutilização e uma década de ferramentas, ao preço da sensibilidade à indentação e da inferência de tipos. A vantagem do JSON5: ele fica a um pequeno passo do JSON estrito, então promover uma configuração a dados de máquina é trivial.

Onde posso ler os padrões citados aqui?

  • RFC 8259 — O formato de intercâmbio de dados JavaScript Object Notation (JSON)
  • ECMA-404 — A sintaxe de intercâmbio de dados JSON