JSON para Desenvolvedores: Sintaxe, Validação e Erros Comuns
· 12 min de leitura
Índice
- O que é JSON e Por que Importa
- Regras de Sintaxe JSON
- Entendendo os Tipos de Dados JSON
- Erros Comuns e Como Evitá-los
- Validando JSON: Ferramentas e Técnicas
- Melhores Práticas de Análise e Serialização
- Considerações de Segurança
- Otimização de Performance
- Ferramentas JSON Essenciais para Desenvolvedores
- Alternativas ao JSON e Quando Usá-las
- Perguntas Frequentes
- Artigos Relacionados
O que é JSON e Por que Importa
JSON (JavaScript Object Notation) tornou-se o padrão de facto para intercâmbio de dados na web. Apesar do nome sugerir uma conexão com JavaScript, JSON é completamente independente de linguagem e suportado por praticamente todas as linguagens de programação modernas.
Originalmente especificado por Douglas Crockford no início dos anos 2000, JSON surgiu como uma alternativa leve ao XML. Sua simplicidade e legibilidade humana o tornaram o formato perfeito para APIs, arquivos de configuração e armazenamento de dados.
Hoje, JSON alimenta tudo, desde APIs REST e bancos de dados NoSQL até arquivos de configuração e pipelines de dados. Entender JSON profundamente não é apenas útil—é essencial para o desenvolvimento de software moderno.
Dica rápida: JSON não é uma linguagem de programação ou um formato de banco de dados. É puramente um formato de serialização de dados—uma maneira de representar dados estruturados como texto.
Regras de Sintaxe JSON
A sintaxe do JSON é enganosamente simples, mas sua rigidez pega muitos desenvolvedores desprevenidos. Ao contrário dos objetos JavaScript, JSON tem tolerância zero para variações de sintaxe.
Aqui está um exemplo JSON válido que demonstra a estrutura central:
{
"name": "RunDev",
"version": 2,
"features": ["formatter", "validator", "converter"],
"config": {
"theme": "dark",
"autoSave": true
},
"deprecated": null
}
As Regras Inegociáveis
Todo documento JSON deve seguir estas regras rígidas:
- Chaves devem ser strings entre aspas duplas —
"name"é válido, masnameou'name'causarão erros de análise - Strings devem usar aspas duplas —
"hello"funciona,'hello'não - Sem vírgulas finais —
[1, 2, 3]está correto,[1, 2, 3,]falhará - Comentários não são permitidos — nem
// commentnem/* comment */são válidos - Use null, não undefined — o
undefineddo JavaScript não existe em JSON - Números seguem formatação específica — sem zeros à esquerda (
10não010), sem notação hexadecimal, semInfinityouNaN
Por que Tão Rígido?
A rigidez do JSON é intencional. Ao eliminar ambiguidade, JSON garante que qualquer documento JSON válido possa ser analisado de forma idêntica em todas as plataformas e linguagens. Essa previsibilidade é o que torna JSON confiável para troca de dados.
A falta de comentários é frequentemente criticada, mas força os desenvolvedores a tornar seus dados autodocumentados através de nomes de chaves claros e estrutura. Para arquivos de configuração onde comentários são necessários, considere JSONC (JSON com Comentários) ou JSON5.
Dica profissional: Use nosso Formatador JSON para corrigir automaticamente erros de sintaxe comuns e garantir que seu JSON seja válido antes da implantação.
Entendendo os Tipos de Dados JSON
JSON suporta exatamente seis tipos de dados. Este conjunto limitado mantém o formato simples enquanto cobre a maioria das necessidades de representação de dados.
| Tipo | Exemplo | Notas |
|---|---|---|
| String | "hello world" |
Deve estar entre aspas duplas. Suporta sequências de escape: \n, \t, \u0041, \", \\ |
| Number | 42, 3.14, -1, 1e10 |
Sem distinção entre inteiro e float. Sem hex, octal ou valores especiais como Infinity |
| Boolean | true, false |
Apenas minúsculas. "true" é uma string, não um booleano |
| Null | null |
Apenas minúsculas. Representa ausência intencional de valor |
| Array | [1, "two", true] |
Lista ordenada. Pode conter tipos mistos (embora arrays homogêneos sejam mais claros) |
| Object | {"key": "value"} |
Pares chave-valor não ordenados. Chaves devem ser strings e devem ser únicas |
Strings e Sequências de Escape
Strings JSON suportam várias sequências de escape para caracteres especiais:
\"— aspas duplas\\— barra invertida\/— barra (opcional, mas válido)\b— backspace\f— form feed\n— nova linha\r— retorno de carro\t— tabulação\uXXXX— caractere Unicode (ex:\u0041para "A")
Strings multilinha devem usar sequências de escape—quebras de linha literais não são permitidas:
{
"correct": "Line 1\nLine 2\nLine 3",
"incorrect": "Line 1
Line 2
Line 3"
}
Números: O que é Permitido e O que Não É
Números JSON são mais restritivos que a maioria das linguagens de programação:
- Válido:
42,-17,3.14159,-0.5,1.23e10,1.23e-10 - Inválido:
.5(deve ser0.5),010(notação octal),0xFF(hex),Infinity,NaN
A especificação JSON não define limites de precisão, mas a maioria das implementações usa ponto flutuante de precisão dupla IEEE 754, o que significa que inteiros são seguros até 2^53 - 1 (9.007.199.254.740.991).
Dica profissional: Para inteiros grandes além do intervalo de inteiros seguros do JavaScript, considere armazená-los como strings para evitar perda de precisão durante a análise.
Objetos e Unicidade de Chaves
Embora a especificação JSON declare que as chaves de objeto devem ser únicas, ela não determina como os analisadores devem lidar com duplicatas. Diferentes implementações se comportam de forma diferente:
- O
JSON.parse()do JavaScript mantém a última ocorrência - Alguns validadores rejeitam chaves duplicadas inteiramente
- Outros mantêm a primeira ocorrência
Melhor prática: Sempre garanta que suas chaves sejam únicas para evitar comportamento imprevisível entre diferentes analisadores.
Erros Comuns e Como Evitá-los
Até desenvolvedores experientes cometem erros de sintaxe JSON. Aqui estão os erros mais frequentes e suas correções:
| Erro | Errado | Correto |
|---|---|---|
| Aspas simples | {'name': 'test'} |
{"name": "test"} |
| Vírgula final | {"a": 1, "b": 2,} |
{"a": 1, "b": 2} |
| Chaves sem aspas | {name: "test"} |
{"name": "test"} |
| Comentários | {"a": 1 // comment} |
Remova comentários ou use JSONC |
| Valor undefined | {"a": undefined} |
{"a": null} |
| Zeros à esquerda | {"port": 080} |
{"port": 80} |
| Novas linhas literais | "line1 |
"line1\nline2" |
| Valores de função | {"fn": function(){}} |
Não suportado—use strings ou reestruture |
A Armadilha do Objeto JavaScript
A maior fonte de erros JSON é tratá-lo como sintaxe literal de objeto JavaScript. Eles parecem similares, mas têm diferenças críticas:
// Objeto JavaScript válido
const jsObj = {
name: 'test', // chave sem aspas, aspas simples
age: 30,
active: true,
getData: function() { return this.name; }, // funções permitidas
// comentário permitido
};
// JSON válido (como string)
const jsonStr = `{
"name": "test",
"age": 30,
"active": true
}`;
Lembre-se: JSON é um formato de dados, não código. Não pode conter funções, comentários ou lógica executável.
Problemas de Codificação de Caracteres
JSON deve ser codificado em UTF-8, UTF-16 ou UTF-32. UTF-8 é a codificação mais comum e recomendada. Cuidado com:
- BOM (Byte Order Mark) no início dos arquivos—alguns analisadores o rejeitam
- Sequências UTF-8 inválidas que podem causar falhas de análise
- Caracteres de controle (U+0000 até U+001F) que devem ser escapados
Dica rápida: Cole seu JSON em nosso Validador JSON para identificar instantaneamente erros de sintaxe, problemas de codificação e problemas estruturais.
Validando JSON: Ferramentas e Técnicas
A validação é crucial para detectar erros antes que causem falhas em tempo de execução. Veja como validar JSON em diferentes ambientes.
Validação por Linha de Comando
Validação rápida usando ferramentas integradas:
# Python (integrado, disponível em todos os lugares)
python3 -m json.tool data.json
# Formatar e validar
python3 -m json.tool data.json output.json
# jq (processador JSON poderoso)
jq . data.json
# jq com detalhes de erro
jq . data.json || echo "Invalid JSON"
# Node.js em uma linha
node -e "console.log(JSON.parse(require('fs').readFileSync('data.json')))"
# Usando jsonlint (instalar via npm)
jsonlint data.json
Validação Programática
Valide JSON no código da sua aplicação:
// JavaScript/Node.js
function isValidJSON(str) {
try {
JSON.parse(str);
return true;
} catch (e) {
console.error('JSON Error:', e.message);
return false;
}
}
# Python
import json
def is_valid_json(json_str):
try:
json.loads(json_str)
return True
except json.JSONDecodeError as e:
print(f'JSON Error: {e}')
return False
// Go
import "encoding/json"
func isValidJSON(data []byte) bool {
var js json.RawMessage
return json.Unmarshal(data, &js) == nil
}
Validação de Schema
A validação de sintaxe apenas verifica se o JSON está bem formado. A validação de schema garante que a estrutura de dados e os tipos correspondam aos seus requisitos.
JSON Schema é o padrão para definir estrutura JSON:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"age": {
"type": "integer",
"minimum": 0,
"maximum": 150
},
"email": {
"type": "string",
"format": "email"
}
},
"required": ["name", "email"]
}
Bibliotecas populares de validação de schema:
- JavaScript: Ajv (mais rápido), joi, yup
- Python: jsonschema, pydantic
- Go: gojsonschema, jsonschema
- Java: everit-org/json-schema, networknt/json-schema-validator
Dica profissional: Use nosso Validador de JSON Schema para testar seus schemas contra dados de exemplo antes de implementá-los no código.
Ferramentas de Validação Online
Para verificações rápidas durante o desenvolvimento:
- Validador JSON RunDev — validação instantânea com mensagens de erro detalhadas
- Formatador JSON RunDev — valide e embeleze em um passo
- JSONLint — validador online clássico
- JSON Schema Validator — teste schemas interativamente
Melhores Práticas de Análise e Serialização
A análise converte texto JSON em estruturas de dados nativas. A serialização faz o inverso. Ambas as operações têm implicações de desempenho e segurança.
Práticas Seguras de Análise
Sempre envolva a análise JSON em tratamento de erros:
// JavaScript - Análise básica
try {
const data = JSON.parse(jsonString);
// Use data
} catch (error) {
console.error('Failed to parse JSON:', error.message);
// Trate o erro apropriadamente
}
// JavaScript - Com função reviver
const data = JSON.parse(jsonString, (key, value) => {
// Transforme datas de strings
if (key.endsWith('Date') && typeof value === 'string') {
return new Date(value);
}
return value;
});
Melhores Práticas de Serialização
Controle como objetos são convertidos para JSON:
// JavaScript - Serialização básica
const json = JSON.stringify(data);
// Formatação bonita com indentação
const json = JSON.stringify(data, null, 2);
// Serialização personalizada com replacer
const json = JSON.stringify(data, (key, value) => {
// Remova campos sensíveis
if (key === 'password' || key === 'apiKey') {
return undefined;
}
// Converta BigInt para string
if (typeof value === 'bigint'