kb.erickguedes.com
JavaScript: Fundamentos para Web

JSON e Armazenamento

Aula 5 de 8

JSON

JSON (JavaScript Object Notation) é o formato mais comum para troca de dados na web.

JSON.stringify e JSON.parse

const usuario = {
  id: 1,
  nome: 'Maria',
  ativo: true,
  tags: ['admin', 'dev'],
  endereco: null,
  data: new Date(),
  funcao: () => 'admin' // ignorado: funções não são serializáveis
};

// Converter para string JSON
const json = JSON.stringify(usuario);
console.log(json);
// {"id":1,"nome":"Maria","ativo":true,"tags":["admin","dev"],"endereco":null,"data":"2026-01-15T10:00:00.000Z"}

// Com formatação
const jsonBonito = JSON.stringify(usuario, null, 2);
console.log(jsonBonito);

// Converter de volta
const obj = JSON.parse(json);
console.log(obj.nome); // 'Maria'
console.log(obj.data); // string ISO, não mais Date!

JSON com Replacer e Reviver

// Replacer: filtrar/transformar na serialização
const jsonFiltrado = JSON.stringify(usuario, ['id', 'nome', 'tags']);

const jsonComTransformacao = JSON.stringify(usuario, (chave, valor) => {
  if (chave === 'data') return new Date(valor).toLocaleDateString('pt-BR');
  return valor;
});

// Reviver: transformar ao fazer parse
const objRevived = JSON.parse(json, (chave, valor) => {
  if (chave === 'data') return new Date(valor);
  return valor;
});

Deep Copy com JSON

const original = {
  nome: 'João',
  endereco: { cidade: 'SP', uf: 'SP' },
  tags: ['dev']
};

// Deep copy (limitação: perde funções, undefined, Date, Symbol)
const copia = JSON.parse(JSON.stringify(original));
copia.endereco.cidade = 'RJ';

console.log(original.endereco.cidade); // 'SP' (não afetado)

Web Storage

localStorage e sessionStorage

// Salvar
localStorage.setItem('tema', 'escuro');
localStorage.setItem('usuario', JSON.stringify({ nome: 'Ana', id: 42 }));

// Ler
const tema = localStorage.getItem('tema');
const usuario = JSON.parse(localStorage.getItem('usuario'));

// Remover
localStorage.removeItem('tema');

// Limpar tudo
localStorage.clear();

// Tamanho
console.log(`${localStorage.length} itens salvos`);

// sessionStorage (mesma API, limpa ao fechar aba)
sessionStorage.setItem('carrinho_temporario', JSON.stringify({ itens: 3 }));

Storage Event

// Escuta mudanças em OUTRAS abas do mesmo domínio
window.addEventListener('storage', (e) => {
  console.log(`Chave: ${e.key}`);
  console.log(`Valor antigo: ${e.oldValue}`);
  console.log(`Valor novo: ${e.newValue}`);
  console.log(`Origem: ${e.url}`);
  console.log(`Storage: ${e.storageArea}`); // localStorage ou sessionStorage
});

Exemplo Prático

// Histórico de busca
function adicionarBusca(termo) {
  const historico = JSON.parse(localStorage.getItem('historico_busca') || '[]');
  historico.unshift(termo);

  // Manter apenas 10 itens
  if (historico.length > 10) historico.pop();

  localStorage.setItem('historico_busca', JSON.stringify(historico));
}

function getHistorico() {
  return JSON.parse(localStorage.getItem('historico_busca') || '[]');
}

function limparHistorico() {
  localStorage.removeItem('historico_busca');
}

Cookies

// Ler todos os cookies
console.log(document.cookie);

// Definir cookie
document.cookie = 'tema=escuro; path=/; max-age=86400; SameSite=Lax';

// Cookie com data de expiração
const data = new Date();
data.setDate(data.getDate() + 30);
document.cookie = `token=abc123; expires=${data.toUTCString()}; path=/; Secure; SameSite=Strict`;

// Remover cookie
document.cookie = 'token=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/';

// Parser simples de cookies
function getCookie(nome) {
  const match = document.cookie.match(new RegExp(`(^| )${nome}=([^;]+)`));
  return match ? decodeURIComponent(match[2]) : null;
}

FormData

const form = document.querySelector('form');

form.addEventListener('submit', (e) => {
  e.preventDefault();

  const formData = new FormData(form);

  // Iterar
  for (const [chave, valor] of formData.entries()) {
    console.log(chave, valor);
  }

  // Para JSON (envio via API)
  const dados = Object.fromEntries(formData);
  console.log(dados);

  // FormData suporta arquivos
  const arquivo = formData.get('avatar');
  console.log(arquivo.name, arquivo.size, arquivo.type);
});

Lab: Carrinho de Compras

Crie um carrinho de compras que persiste em localStorage com JSON. Adicione/remova itens e calcule o total.

# Abra o HTML, adicione itens, feche e reabra
# Os itens devem persistir
const CARRINHO_KEY = 'carrinho';

function carrinhoGet() {
  return JSON.parse(localStorage.getItem(CARRINHO_KEY) || '[]');
}

function carrinhoAdicionar(produto) {
  const itens = carrinhoGet();
  const existente = itens.find(i => i.id === produto.id);
  if (existente) {
    existente.quantidade += produto.quantidade || 1;
  } else {
    itens.push({ ...produto, quantidade: produto.quantidade || 1 });
  }
  localStorage.setItem(CARRINHO_KEY, JSON.stringify(itens));
}

function carrinhoRemover(id) {
  const itens = carrinhoGet().filter(i => i.id !== id);
  localStorage.setItem(CARRINHO_KEY, JSON.stringify(itens));
}

function carrinhoTotal() {
  return carrinhoGet().reduce((acc, i) => acc + i.preco * i.quantidade, 0);
}

JSON é a língua franca da web. localStorage é para dados que precisam persistir. Cookies são para autenticação e rastreamento.