Pular para o conteudo principal
CuteJSON
↑↓ Navegar Enter Selecionar Esc Fechar

Como converter JSON para literais de objetos JavaScript e vice versa

Publicado 3 min de leitura Por Akash Kinkar Pandey

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.

Voltar a todos os posts