JSON

13 tools

O que é JSON?

JSON (JavaScript Object Notation) é um formato leve de intercâmbio de dados baseado em texto, fácil de ler e escrever para humanos e fácil de analisar e gerar para máquinas. Originado do JavaScript, o JSON é independente de linguagem e é o padrão de facto para troca de dados na web.

O JSON representa dados como pares chave-valor organizados em objetos e arrays. Sua simplicidade o tornou o formato dominante para APIs REST, arquivos de configuração e armazenamento de dados.

Uma breve história

O JSON foi formalizado por Douglas Crockford no início dos anos 2000. A especificação foi publicada em json.org em 2001. O RFC 4627 foi publicado em 2006, e o atual padrão ECMA-404 em 2013.

Antes do JSON, o XML era o formato dominante de intercâmbio de dados na web. O minimalismo do JSON — sem atributos, instruções de processamento ou namespaces — o tornou imediatamente popular. Em 2010, o JSON havia substituído amplamente o XML para APIs web.

Tipos de dados JSON

O JSON suporta exatamente seis tipos de dados. Todo valor em um documento JSON válido deve ser um destes:

String"hello world"

Qualquer sequência de caracteres Unicode entre aspas duplas. Sequências de escape com barra invertida (\n, \t, \") são suportadas.

Number42 / 3.14 / 1e10

Inteiro ou ponto flutuante. Notação científica (1e10) é permitida. Sem distinção entre int e float no nível JSON.

Booleantrue / false

Os tokens literais true ou false (apenas minúsculas). Não há verdadeiro/falso — apenas booleano estrito.

Nullnull

O token literal null (minúsculas). Representa ausência de valor. Diferente de undefined, que não é um tipo JSON.

Array[1, "two", null]

Uma lista ordenada de valores entre colchetes. Os elementos podem ser de tipos mistos e arrays podem ser aninhados arbitrariamente.

Object{"key": "value"}

Uma coleção não ordenada de pares chave-valor entre chaves. As chaves devem ser strings. Os valores podem ser qualquer tipo JSON.

{
  "string":  "hello world",
  "number":  42,
  "float":   3.14,
  "boolean": true,
  "null":    null,
  "array":   [1, 2, 3],
  "object":  { "nested": "value" }
}

Regras de sintaxe JSON

O JSON tem regras de sintaxe estritas. Um pequeno desvio causa um erro de análise. Estas são as seis regras mais importantes:

Apenas strings com aspas duplas

Todos os valores de string e chaves de objeto devem usar aspas duplas. Aspas simples não são JSON válido.

Sem vírgulas finais

O JSON não permite vírgulas finais após o último elemento em um array ou a última propriedade em um objeto.

Sem comentários

O JSON não tem sintaxe de comentários. // e /* */ não são válidos. Para arquivos de configuração que precisam de comentários, considere JSON5 ou YAML.

Sem undefined ou funções

O JSON suporta apenas seis tipos primitivos. Valores JavaScript como undefined, NaN, Infinity e funções não podem ser representados.

Chaves de objeto devem ser strings

Todas as chaves de objeto devem ser strings entre aspas. Chaves numéricas ou identificadores sem aspas não são permitidos.

Literais sensíveis a maiúsculas

O JSON é sensível a maiúsculas. true, false e null devem estar em minúsculas.

JSON inválido vs. válido

Inválido
{
  'name': 'Alice',       // single quotes — invalid
  age: 30,              // unquoted key — invalid
  "scores": [1, 2, 3,], // trailing comma — invalid
  "note": undefined     // undefined — invalid
}
Válido
{
  "name": "Alice",
  "age": 30,
  "scores": [1, 2, 3],
  "note": null
}

JSON na web moderna

APIs REST

O JSON é o formato de corpo padrão para solicitações e respostas de API REST. Praticamente todas as linguagens de programação têm um analisador JSON integrado.

Arquivos de configuração

package.json, tsconfig.json, .eslintrc e muitas outras ferramentas de desenvolvedor usam JSON para configuração.

Bancos de dados NoSQL

Bancos de dados de documentos como MongoDB, CouchDB e Amazon DynamoDB armazenam dados como documentos JSON.

Estado e dados do frontend

localStorage e sessionStorage armazenam strings, então JSON.stringify/JSON.parse são usados constantemente para serializar objetos JavaScript.

JSON vs. outros formatos

O JSON nem sempre é a melhor escolha. Veja como ele se compara a outros formatos de dados comuns:

JSON vs XML
Vantagens do JSON sobre XML

Sintaxe mais simples, tamanho de arquivo menor, mais fácil de analisar, mais legível

Desvantagens do JSON vs XML

Sem suporte para atributos, instruções de processamento ou namespaces XML

Escolha XML quando

Você precisa de metadados de documento, modelos de conteúdo misto ou esquemas XML

JSON vs YAML
Vantagens do JSON sobre YAML

Sintaxe mais estrita (menos ambiguidade), melhor suporte de ferramentas, mais portátil

Desvantagens do JSON vs YAML

Sem suporte a comentários, ligeiramente mais verboso para dados profundamente aninhados

Escolha YAML quando

Arquivos de configuração editados por humanos, Docker Compose, GitHub Actions, manifestos do Kubernetes

JSON vs TOML
Vantagens do JSON sobre TOML

Maior suporte de ecossistema, análise mais rápida, tratamento de tipos mais previsível

Desvantagens do JSON vs TOML

Sem tipo de data nativo, menos amigável para estruturas aninhadas complexas

Escolha TOML quando

Rust (Cargo.toml), Python (pyproject.toml), configuração de aplicativos estilo INI

JSON vs CSV
Vantagens do JSON sobre CSV

Dados estruturados e aninhados, não limitado a linhas e colunas simples

Desvantagens do JSON vs CSV

Tamanho de arquivo muito maior, pior desempenho para dados puramente tabulares

Escolha CSV quando

Dados de planilha, exportações de banco de dados, dados a serem abertos no Excel ou pandas

JSON Schema

JSON Schema é um vocabulário para validar a estrutura de documentos JSON. Um esquema descreve os tipos esperados, campos obrigatórios e restrições de um valor JSON.

Ferramentas como ajv (JavaScript), jsonschema (Python) e validadores integrados em muitos IDEs suportam JSON Schema. O OpenAPI usa JSON Schema para descrever corpos de solicitação e resposta de API.

Armadilhas comuns do JSON

Perda de precisão numérica

Os números JSON são analisados como floats de dupla precisão IEEE 754. Inteiros maiores que 2^53 perdem precisão. Passe IDs grandes como strings.

Sem tipo de data

O JSON não tem tipo de data. As datas são tipicamente serializadas como strings ISO 8601 ou timestamps Unix.

Referências circulares travam serializadores

JSON.stringify lança um TypeError em referências circulares de objeto. Você precisa quebrar o ciclo ou usar uma biblioteca que o trate.

Problemas de Unicode e BOM

O JSON deve ser codificado como UTF-8, UTF-16 ou UTF-32. Uma Marca de Ordem de Bytes (BOM) no início de um arquivo JSON não é compatível com a especificação.

Poluição de protótipo

Ao analisar JSON não confiável, mesclar objetos analisados pode ser vulnerável a ataques de poluição de protótipo via a chave __proto__.

Null vs. chave ausente

{"key": null} e uma "key" ausente são semanticamente diferentes. Null significa que o campo existe com um valor ausente; ausente significa que o campo não foi especificado.

Perguntas frequentes

O que significa JSON?

JSON significa JavaScript Object Notation. Apesar do nome, o JSON é completamente independente de linguagem.

JSON é o mesmo que um objeto JavaScript?

Não. O JSON é um formato de texto que se parece com um literal de objeto JavaScript, mas tem regras mais estritas.

O JSON pode ter comentários?

Não. A especificação JSON não inclui sintaxe de comentários. Para arquivos de configuração que precisam de comentários, considere JSONC, JSON5 ou YAML.

Qual é a diferença entre JSON e JSONP?

JSONP foi uma solução alternativa para a política de mesma origem do navegador. É obsoleto — use CORS em vez disso.

Como faço para formatar JSON de forma legível?

Em JavaScript: JSON.stringify(data, null, 2). Em Python: json.dumps(data, indent=2). No terminal: cat file.json | python3 -m json.tool ou cat file.json | jq .

O que é NDJSON ou JSON Lines?

NDJSON armazena um objeto JSON por linha, permitindo processamento em fluxo. É popular para arquivos de log e exportações de dados grandes.

O espaço em branco importa no JSON?

O espaço em branco entre tokens é insignificante. A formatação é uma questão de estilo, não de semântica.

Qual é o tamanho máximo de um arquivo JSON?

A especificação JSON não define limite de tamanho. Na prática, você é limitado pela memória do analisador e pela transferência de rede.

O JSON pode representar dados binários?

Não diretamente. Os dados binários devem ser codificados em Base64 antes de serem incorporados no JSON, o que aumenta o tamanho em ~33%.

O que é JSON5?

JSON5 é um superconjunto do JSON que adiciona: chaves sem aspas, strings com aspas simples, vírgulas finais, comentários e strings multilinha. Requer um analisador separado.