Módulo 7 - Trabalhando com JSON
Prática: um catálogo de produtos em JSON
11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Montar um catálogo de produtos como lista de dicionários.
- Salvar o catálogo em produtos.json com acentos preservados.
- Ler o arquivo de volta e confirmar que os dados voltam intactos.
- Filtrar produtos por preço percorrendo a lista carregada.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Prática: um catálogo de produtos em JSON.
Os objetivos desta aula. Montar um catálogo de produtos como lista de dicionários. Salvar o catálogo em produtos.json com acentos preservados. Ler o arquivo de volta e confirmar que os dados voltam intactos. Filtrar produtos por preço percorrendo a lista carregada.
Veja o essencial, parte por parte.
Montando e salvando o catálogo. O catálogo é uma lista de dicionários, um dicionário por produto.
Lendo de volta e filtrando por preço. baratos = [p for p in catalogo if p["preco"] <= 50] cria a lista filtrada em uma linha.
O que você construiu e para onde vai. Pare um instante para ver o tamanho do que você acabou de fazer.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Montando e salvando o catálogo
Chegou a prática que amarra o módulo. Você vai construir um pequeno catálogo de produtos de uma loja, gravar em arquivo, ler de volta e filtrar por preço. Comece montando os dados. Cada produto é um dicionário com nome, categoria e preço; o catálogo inteiro é uma lista desses dicionários. Depois grave o catálogo em produtos.json, com todos os cuidados que você aprendeu: modo de escrita, encoding utf-8, indentação e acentos preservados.
import json
catalogo = [
{"nome": "Caderno universitário", "categoria": "Papelaria", "preco": 24.9},
{"nome": "Caneta gel", "categoria": "Papelaria", "preco": 6.5},
{"nome": "Mochila", "categoria": "Acessórios", "preco": 149.0},
{"nome": "Fone de ouvido", "categoria": "Eletrônicos", "preco": 89.9},
]
with open("produtos.json", "w", encoding="utf-8") as arquivo:
json.dump(catalogo, arquivo, indent=2, ensure_ascii=False)
print("Catálogo salvo com", len(catalogo), "produtos.")
# Catálogo salvo com 4 produtos.O catálogo é uma lista de dicionários gravada em produtos.json com acentos preservados.
Rode esse código e abra o arquivo produtos.json no seu editor. Você verá o JSON indentado, com Acessórios e Eletrônicos legíveis, exatamente por causa do ensure_ascii=False e do encoding utf-8. Esse arquivo agora existe de forma independente do programa: se você fechar o Python e voltar amanhã, os dados continuam lá. É essa persistência que torna arquivos tão úteis, e é a próxima parte que os recupera.
Lendo de volta e filtrando por preço
Agora leia o arquivo de volta e faça algo útil com ele: liste só os produtos abaixo de um preço. Você carrega o catálogo com json.load, percorre a lista e usa uma condição para selecionar os produtos baratos. Esse é o tipo de filtragem que aparece o tempo todo em programas que lidam com listas de dados. Confira que os acentos voltaram intactos, prova de que o ciclo de gravar e ler preservou tudo.
import json
with open("produtos.json", "r", encoding="utf-8") as arquivo:
catalogo = json.load(arquivo)
limite = 50.0
print(f"Produtos até R$ {limite:.2f}:")
for produto in catalogo:
if produto["preco"] <= limite:
print(f"- {produto['nome']}: R$ {produto['preco']:.2f}")
# Produtos até R$ 50.00:
# - Caderno universitário: R$ 24.90
# - Caneta gel: R$ 6.50json.load recupera o catálogo; o laço com if filtra os produtos dentro do limite de preço.
Vale experimentar variações para fixar. Mude o limite de preço e rode de novo. Filtre por categoria em vez de preço, trocando a condição para produto["categoria"] == "Papelaria". Some o preço de todos os produtos, como você fez na aula de dados aninhados. Cada variação usa as mesmas peças: carregar o JSON, percorrer a lista, aplicar uma condição. Esse trio é a base de quase todo programa que consome dados salvos em JSON.
O que você construiu e para onde vai
Pare um instante para ver o tamanho do que você acabou de fazer. Você criou dados estruturados, salvou em um arquivo real com acentos corretos, recuperou esses dados em outra execução e extraiu deles a informação que interessava. Esse é o ciclo de vida de dados em quase todo programa útil: entra, é guardado, sai e é processado. Um catálogo de produtos, uma lista de contatos, um registro de despesas, tudo segue esse mesmo desenho.
| Etapa da prática | Função usada | O que garantiu os acentos |
|---|---|---|
| Montar o catálogo | Lista de dicionários | Texto em Unicode do Python |
| Salvar em arquivo | json.dump | encoding utf-8 e ensure_ascii=False |
| Ler de volta | json.load | encoding utf-8 na abertura |
| Filtrar por preço | laço com if | Dados já em memória, intactos |
As quatro etapas do exercício e o que preservou os acentos em cada uma.
Daqui, você já pode aplicar o JSON em projetos de verdade: guardar as configurações de um programa, salvar o progresso de um jogo, consumir dados de uma API pública. O próximo módulo do curso trata de outro formato tabular muito comum, o CSV, que brilha em planilhas e relatórios. Juntos, JSON e CSV cobrem a imensa maioria das necessidades de ler e gravar dados que você vai encontrar pela frente.
Teste rápido
Na prática do catálogo, por que os acentos de Acessórios e Eletrônicos apareceram corretos no arquivo e na leitura?
Perguntas frequentes
- Por que o catálogo é uma lista e não um dicionário?
- Porque são vários produtos parecidos, sem uma chave única óbvia para cada um. Uma lista percorre bem itens semelhantes com um laço. Se cada produto tivesse um código único, um dicionário com esse código como chave também funcionaria. Para catálogos, a lista de dicionários é o formato mais natural.
- Como eu adicionaria um produto novo ao catálogo salvo?
- Você lê o arquivo com json.load, faz catalogo.append(novo_produto) para incluir o dicionário do novo item e grava tudo de volta com json.dump. Esse ciclo de ler, alterar e regravar é o padrão para atualizar dados em um arquivo JSON sem perder o que já estava lá.
- O :.2f no f-string tem a ver com JSON?
- Não diretamente. O :.2f apenas formata o número com duas casas decimais na hora de exibir, para o preço sair como 24.90 em vez de 24.9. É recurso de f-string, visto no básico. O valor guardado no JSON continua sendo o número puro; a formatação é só para mostrar na tela.
- Posso filtrar por mais de uma condição ao mesmo tempo?
- Sim. Combine condições com and e or no if, por exemplo if produto["preco"] <= 50 and produto["categoria"] == "Papelaria". A mesma ideia vale na compreensão de lista. Assim você seleciona, por exemplo, só os produtos de papelaria abaixo de um preço.
- E se o arquivo produtos.json ainda não existir na primeira execução?
- A parte que grava cria o arquivo, então rode primeiro o código que monta e salva o catálogo. Se você tentar ler antes de gravar, o Python levanta FileNotFoundError. Em um programa completo, é comum verificar se o arquivo existe e criar um catálogo vazio quando ele falta.
- Esse catálogo serve de base para um projeto maior?
- Serve muito bem. A partir dele você pode adicionar busca por nome, ordenação por preço, contagem por categoria e edição de itens. Quando o programa cresce, vale organizar essas operações em funções, e mais adiante em classes, temas que o curso trata nos módulos de orientação a objetos.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.