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

Tipos de dados JSON explicados, com os casos extremos que quebram parsers

Publicado 4 min de leitura Por Akash Kinkar Pandey

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.

Voltar a todos os posts