Módulo 7 - Trabalhando com JSON

De JSON para Python com json.loads

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Converter uma string JSON em dados do Python com json.loads.
  • Acessar campos do dicionário e itens da lista que resultam da conversão.
  • Diferenciar json.loads (de texto) do json.dumps (para texto).
  • Reconhecer o erro de JSON inválido e o que costuma causá-lo.

De texto para dados com json.loads

Na aula anterior você foi do Python para o JSON. Agora faça o caminho de volta. Muitas vezes você recebe dados como texto: a resposta de uma API chega como uma string JSON, ou você lê o conteúdo de um arquivo. Esse texto sozinho não serve para trabalhar; você precisa dos dados vivos, em dicionários e listas. A função json.loads faz essa desserialização. Veja um exemplo com uma string JSON escrita à mão.

import json

texto = '{"nome": "Ana", "idade": 29, "assinante": true, "cidade": "Belém"}'

dados = json.loads(texto)

print(type(dados))   # <class 'dict'>
print(dados["nome"])  # Ana
print(dados["idade"]) # 29

json.loads transforma a string em um dicionário do Python, acessado com colchetes.

Note que, depois do json.loads, o resultado é um dicionário comum, sem nada de especial. Você acessa dados["nome"], percorre com um laço, altera valores, tudo como aprendeu no básico. O true do JSON virou True do Python, o inverso do que aconteceu no dumps. E o Belém veio com acento certo, porque o Python trabalha com texto em Unicode por dentro. A conversão de tipos é simétrica à da aula anterior.

Acessando campos e listas do resultado

Quando o JSON é um array na raiz, o json.loads devolve uma lista, não um dicionário. É comum uma API responder com uma lista de itens, cada item um dicionário. Nesse caso, você percorre a lista com um laço e acessa os campos de cada elemento. Combinar lista por fora e dicionário por dentro é o padrão mais frequente que você vai encontrar, e a próxima aula sobre dados aninhados aprofunda esse ponto.

import json

texto = '[{"nome": "Ana", "nota": 9}, {"nome": "João", "nota": 7}]'

alunos = json.loads(texto)

print(type(alunos))   # <class 'list'>
print(len(alunos))    # 2

for aluno in alunos:
    print(aluno["nome"], "tirou", aluno["nota"])
# Ana tirou 9
# João tirou 7

Um array JSON vira uma lista de dicionários, percorrida com um laço normal.

json.dumps (ida)

  • Recebe dados do Python
  • Devolve uma string JSON
  • Usado para salvar ou enviar
  • True vira true, None vira null

json.loads (volta)

  • Recebe uma string JSON
  • Devolve dados do Python
  • Usado para ler o que chegou
  • true vira True, null vira None

Guardar essa simetria evita confusão: dumps produz texto, loads consome texto. Uma dica de memória: pense no dump como despejar dados em texto e no load como carregar dados a partir do texto. Sempre que estiver diante de uma string e quiser trabalhar com os dados, é loads. Sempre que tiver dados e quiser um texto, é dumps. Com esses dois, você já cobre a maioria das tarefas do dia a dia com JSON.

Quando o JSON está quebrado

Nem todo texto que parece JSON é JSON válido. Um erro clássico é usar aspas simples em vez de duplas, porque o Python aceita aspas simples em strings, mas o JSON não. Outros tropeços comuns são uma vírgula a mais depois do último item, uma chave sem fechar ou usar True com maiúscula no texto. Quando o json.loads encontra qualquer um desses problemas, ele para e levanta um JSONDecodeError, apontando onde tropeçou.

import json

# Aspas simples nao valem em JSON; o correto usa aspas duplas.
texto_ruim = "{'nome': 'Ana'}"

try:
    dados = json.loads(texto_ruim)
except json.JSONDecodeError as erro:
    print("JSON inválido:", erro)
# JSON inválido: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

Tratar o JSONDecodeError com try e except evita que o programa quebre com dados ruins.

A boa prática, ao receber JSON de fora, é envolver o json.loads em um try e except, como no exemplo. Assim, se o dado chegar corrompido, o seu programa reage com uma mensagem clara em vez de simplesmente quebrar. O módulo de exceções do curso aprofunda esse assunto, mas já dá para adotar o hábito agora. Com a ida e a volta dominadas, a próxima aula ensina a gravar e ler JSON em arquivos de verdade.

Teste rápido

Você recebe a resposta de uma API como texto e quer acessar os campos no Python. Qual função usar?

Perguntas frequentes

Qual a diferença entre json.loads e json.load?
O loads, com s de string, recebe um texto JSON e o converte. O load, sem o s, lê o JSON direto de um arquivo aberto. Nesta aula você usa loads com strings; a próxima aula apresenta o load para carregar de um arquivo em disco.
O json.loads sempre devolve um dicionário?
Não necessariamente. Ele devolve o que o JSON representa na raiz. Se o JSON começa com chaves, o resultado é um dicionário; se começa com colchetes, é uma lista. JSON também pode ser um número ou um texto solto, e nesses casos loads devolve um número ou uma string.
Por que aspas simples quebram o json.loads?
Porque o padrão JSON exige aspas duplas em textos e em nomes de chave. O Python aceita aspas simples nas suas próprias strings, o que confunde quem está começando, mas o JSON é mais rígido. Se um texto vem com aspas simples, ele não é JSON válido e o loads levanta um erro.
Como evito que meu programa quebre com um JSON inválido?
Envolva a chamada a json.loads em um bloco try e except json.JSONDecodeError. Assim, quando o texto chega corrompido, você trata o erro com uma mensagem amigável ou um valor padrão, em vez de deixar o programa parar. É especialmente importante ao consumir dados de fontes externas.
O acento volta certo depois do json.loads?
Sim. O Python trabalha com texto em Unicode internamente, então tanto acentos legíveis quanto os escapados como \u00e9 no JSON viram o caractere correto no dicionário resultante. Você não precisa fazer nada de especial; o Belém e o café voltam com os acentos no lugar.
Posso alterar os dados depois de fazer o loads?
Sim. O resultado do loads é um dicionário ou uma lista comum do Python, então você pode adicionar chaves, mudar valores, remover itens e percorrer com laços à vontade. Se quiser salvar essas mudanças de volta em JSON, basta converter com dumps ou gravar com dump.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.