Todo documento JSON ja e uma expressao JavaScript valida. Voce pode colar
JSON em uma atribuicao const config = e executa. O trabalho interessante
e o reverso: literais de objetos JavaScript reais estao cheios de coisas
que JSON proibe, e um conversor que adivinha o que significavam perde
dados enquanto reporta sucesso.
Usando o conversor JSON para JavaScript
Escolha uma direcao e pressione Convertendo. Ao escrever JavaScript, uma
chave de objeto que e um identificador valido e escrita sem aspas, entao
"name" se torna name, enquanto uma chave como "display name" permanece
entre aspas porque escrive-la sem aspas mudaria sua ortografia. Um objeto
ou array vazio permanece em uma linha. Numeros viajam pelo fluxo de tokens
em vez de por JSON.parse, entao um inteiro de vinte digitos retorna com
os vinte digitos completos.
O que o leitor aceita
Lendo JavaScript de volta para JSON, a ferramenta entende os literais de
objetos que voce realmente colaria de um arquivo de configuracao: chaves
sem aspas, strings entre aspas simples, comentarios // e /* */, virgulas
finais, e um nome const, let ou var opcional no inicio com um ponto
e virgula no final. Um literal de template sem interpolacao tambem e aceito,
pois contem texto puro.
Uma ortografia de numero que JSON rejeita e normalizada para sua forma JSON exata:
const numbers = { a: .5, b: 5., c: 5.e3 }
{
"a": 0.5,
"b": 5,
"c": 5e3
}
O que e recusado, e porque
Tudo que JSON nao pode conter e recusado por nome em vez de adivinhado.
undefined, NaN e Infinity nao tem numero ou valor JSON, entao sao
recusados. Tambem numeros hexadecimais, octais e binarios, separadores de
digitos com sublinhado como 1_000, e um zero a esquerda, todos os quais
mudariam de significado se JSON os lesse. Uma expressao regular, uma funcao,
uma palavra solta, e interpolacao de template ${...} tambem sao recusados,
pois sao codigo, nao dados.
Duas recusas merecem um olhar mais atento. Aparecer duas vezes em um
objeto e recusado, pois JSON nao tem como conter ambos os valores sob um
unico nome. E uma chave __proto__ cujo valor e um objeto ou null e
recusada, pois em um literal de objeto JavaScript essa ortografia nao cria
uma propriedade. Ela define o prototype do novo objeto, entao convertela
para JSON com uma chave __proto__ comum inventaria uma propriedade que
o codigo original nunca teve.
Por que undefined nao e convertido em null por padrao
JSON nao tem undefined, entao um conversor tem que fazer algo. Escrever
null muda silenciosamente o que os dados significavam: um undefined em
um objeto de configuracao geralmente significa que um campo ainda nao esta
configurado, o que nao e a mesma coisa que um null que o codigo verifica
depois. A ferramenta recusa por padrao, e a opcao Convert undefined to null
existe para quando voce realmente quer esse significado.
Volta completa
Converter um documento de volta para o outro formato e o verdadeiro teste de se as regras de aspas e recusa estao corretas. Um literal de objetos com chaves sem aspas, aspas simples e uma virgula final retorna como JSON com cada chave entre aspas e cada digito intacto, e converter esse JSON de volta retorna o mesmo objeto. Uma regra errada geralmente so aparece quando voce converte de volta e compara.