O JSON tem exatamente seis tipos de valor: string, numero, booleano, nulo, array e objeto. Nada na especificacao adiciona um setimo. Essa lista curta e facil de enunciar e surpreendentemente facil de errar na pratica, principalmente nas margens que cada tipo tem e que os tipos nativos de uma linguagem nao compartilham.
String
Texto entre aspas duplas, nunca aspas simples. 'hello' nao e JSON
valido, apenas "hello" e. Alguns caracteres precisam de escape dentro de uma string:
a propria aspa (\"), uma barra invertida (\\), e os caracteres de controle
\n, \r, \t, \b e \f. Qualquer outra coisa, incluindo a maior parte do texto Unicode,
pode ser colocada sem escape desde que o arquivo seja UTF-8 valido. JSON Escape
and Unescape realiza a conversao em ambas
direcoes e relata exatamente que character quebrou uma sequencia de escape
mal formada, em vez de um erro de analise generico.
Numero
Um unico tipo numerico, nao tipos inteiros e de ponto flotante separados como em algumas
linguagens. Um numero JSON e uma sequencia de digitos, um ponto decimal
opcional, e um expoente opcional: 42, -3.14, 2.5e10. Sem hexadecimal, sem
Infinity, sem NaN, e sem zero a esquerda antes de um digito diferente de zero (0123 e
invalido, 0.123 esta correto). A margem mais delicada aqui: o tipo Number
do JavaScript e um float de 64 bits, que nao consegue representar exatamente cada inteiro alem de cerca de 2^53
(approximadamente nove trilhoes). Analise um documento JSON contendo um
ID de banco de dados de 64 bits ou um Snowflake ID com JSON.parse no console de um navegador
e os ultimos digitos podem voltar arredondados, silenciosamente. O JSON
Formatter deste site e construido sobre um fluxo de
tokens em vez de JSON.parse especificamente para que um inteiro de vinte digitos
sobreviva uma ida e volta sem arredondamento, e relata os numeros que nao conseguiu
representar com seguranca em vez de arredondar sem avisar.
Booleano
Exatamente dois valores literais, em minusculas, sem aspas: true e false.
"true" e uma string, nao um booleano, e uma fonte comum de bugs quando um
campo que deveria ser booleano e serializado como texto em algum lugar a montante.
Nulo
Um valor literal, em minuscula, sem aspas: null. Representa a ausencia
deliberada de um valor, que e algo diferente de uma chave que falta completamente.
{"middleName": null} diz “esta pessoa nao tem segundo nome, e
verificamos.” Um documento sem a chave middleName completamente nao diz nada sobre
se uma existe. APIs que confundem os dois (usando uma chave ausente e um
valor nulo de forma intercambiavel) tornam essa distincao impossivel de recuperar
no lado receptor.
Array
Uma lista ordenada, [ ], separada por virgulas, com elementos de qualquer tipo incluindo
tipos misturados no mesmo array: [1, "two", true, null] e JSON valido, embora
seria uma escolha de schema peculiar. A ordem e garantida e
significativa; dois arrays com os mesmos elementos em ordens diferentes sao
valores diferentes.
Objeto
Um conjunto nao ordenado de pares chave-valor, { }, onde as chaves sempre sao strings (mesmo uma
chave com aparencia numerica como "2" e uma string, nao um numero), e os valores podem ser de qualquer tipo.
Duas chaves com o mesmo nome dentro de um objeto nao sao proibidas pela
gramatica, embora a especificacao descreva o comportamento como “nao recomendado” e
deixe o que acontece a seguir para o analisador; a maioria das implementacoes, incluindo
JSON.parse, silenciosamente mantem a ultima e descarta as anteriores. O
JSON Validator sinaliza uma chave duplicada como um
aviso em vez de deixar passar um documento contendo uma silenciosamente, ja que qual
valor sobrevive e o tipo de coisa que deveria ser uma decisao explicita.
O que nenhum dos seis tipos pode conter
Sem tipo de data: um timestamp e uma string, quase sempre no formato ISO 8601
("2026-08-24T10:00:00Z"), por convencao ao inves de algo que o JSON
imponha. Sem undefined: uma chave que seria undefined em
JavaScript e omitida do objeto em vez de escrita com esse valor,
ja que JSON nao tem nenhum literal para isso. Sem funcoes, sem Map ou Set,
sem comentarios em lugar nenhum no documento. Um formato que precisa de qualquer uma dessas
(comentarios inline em configuracoes, por exemplo) esta escolhendo um formato
diferem propositalmente, nao uma extensao de JSON; veja JSON vs YAML
para o compromisso que o suporte a comentarios e algumas outras comodidades implicam.
Testando
Cole qualquer documento no JSON Viewer e cada valor recebe sua propria cor e badge na arvore, que e uma forma rapida de ver exatamente como um documento e tipado sem ler o texto bruto caractere por caractere. Para ver as regras de sintaxe de uma vez, veja a JSON Cheat Sheet.