2.1 Módulo json
JSON (JavaScript Object Notation) é um formato leve de troca de dados que é fácil de ler e escrever para humanos, e fácil de analisar e gerar para computadores. JSON é frequentemente usado para transmitir dados entre um servidor e um aplicativo web, e também para armazenar configurações e opções.
O módulo json
em Python fornece funções para serialização
(transformar objetos Python em strings JSON) e desserialização
(transformar strings JSON em objetos Python). Este módulo está embutido na
biblioteca padrão do Python e é usado ativamente para trabalhar com
dados JSON.
As funções principais do módulo json
são muito semelhantes às do
pickle
e funcionam de maneira similar. O que você espera? É o padrão!
-
Trabalhando com strings:
-
json.dumps(obj)
— Transforma um objeto Python em uma string JSON. -
json.loads(s)
— Transforma uma string JSON em um objeto Python.
-
-
Trabalhando com arquivos:
-
json.dump(obj, file)
— Serializa um objeto Python e escreve no arquivo de texto. -
json.load(file)
— Desserializa um objeto Python a partir de um arquivo de texto que contém dados em formato JSON.
-
Vamos ver alguns exemplos para lembrar melhor como essas funções funcionam.
2.2 Serialização para string
Serialização de objetos Python para strings JSON
Para serializar um objeto para uma string, basta passá-lo para a função
json.dumps()
.
import json
# Exemplo de objeto para serialização
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
# Transformar objeto Python em string JSON
json_string = json.dumps(data, indent=4)
print("Dados serializados (JSON):", json_string)
Desserialização de strings JSON para objetos Python
Para obter um objeto a partir de uma string, basta passar a string JSON,
que contém a descrição do objeto, para o método json.loads()
.
import json
# Exemplo de string JSON para desserialização
json_string = '''
{
"name": "Alice",
"age": 30,
"is_student": false,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
'''
# Transformar string JSON em objeto Python
data = json.loads(json_string)
print("Dados desserializados (Python):", data)
2.3 Serialização para arquivo
Escrevendo objetos Python em arquivo no formato JSON
Para escrever um objeto em arquivo, você precisa chamar o método
json.dump()
. Ao trabalhar com arquivos, é importante usar o tratamento de exceções
para lidar corretamente com possíveis erros. Veja um exemplo:
import json
# Exemplo de objeto para serialização
data = {
"name": "Bob",
"age": 25,
"is_student": True,
"courses": ["History", "Literature"],
"address": {
"city": "Los Angeles",
"zip_code": "90001"
}
}
# Escrever objeto Python em arquivo JSON com tratamento de exceções
try:
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
print("Dados gravados com sucesso no arquivo.")
except IOError:
print("Erro ao escrever no arquivo.")
except json.JSONEncodeError:
print("Erro ao codificar JSON.")
Lendo objetos Python de arquivo no formato JSON
A leitura também é muito simples — basta passar o arquivo para o método
json.load()
. Aqui também é importante usar o tratamento de exceções:
import json
# Ler objeto Python de arquivo JSON com tratamento de exceções
try:
with open('data.json', 'r') as file:
data = json.load(file)
print("Dados desserializados do arquivo (Python):", data)
except IOError:
print("Erro ao ler o arquivo.")
except json.JSONDecodeError:
print("Erro ao decodificar JSON.")
2.4 Parâmetros adicionais das funções
Na função que lida com a serialização, você pode passar parâmetros adicionais que vão deixar seu JSON mais bonito:
-
skipkeys
: SeTrue
, ignora as chaves que não são strings, números ouNone
. -
ensure_ascii
: SeTrue
, todos os caracteres não ASCII serão escapados usando Unicode escape sequences. -
indent
: Se um número for especificado, os recuos serão adicionados para melhor legibilidade. -
sort_keys
: SeTrue
, as chaves no JSON serão classificadas em ordem alfabética.
Exemplo de uso dos parâmetros json.dumps()
:
import json
data = {"c": 3, "b": 2, "a": 1}
# Serialização com ordenação de chaves e indentação
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
2.5 Decodificadores e codificadores personalizados
O módulo json
permite usar funções personalizadas
para serialização e desserialização de objetos.
Exemplo de codificador personalizado
Primeiro, criamos uma classe codificadora especial, que dentro dela checa se
o tipo do objeto == datetime, então retorna o objeto como uma string
no formato ISO
.
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {
"name": "Alice",
"timestamp": datetime.now()
}
# Serialização com codificador personalizado
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)
Exemplo de decodificador personalizado
Para a operação inversa, também precisamos de uma função que transforma a string
em data. Por exemplo, podemos simplesmente
checar o nome do campo, e se for chamado timestamp, transformar
a string em um objeto datetime
:
import json
from datetime import datetime
def custom_decoder(dct):
if 'timestamp' in dct:
dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
return dct
json_string = '''
{
"name": "Alice",
"timestamp": "2023-05-15T14:30:00"
}
'''
# Desserialização com decodificador personalizado
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
GO TO FULL VERSION