CodeGym /Curso Java /Python SELF PT /Trabalhando com JSON usando json

Trabalhando com JSON usando json

Python SELF PT
Nível 23 , Lição 1
Disponível

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: Se True, ignora as chaves que não são strings, números ou None.
  • ensure_ascii: Se True, 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: Se True, 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)
    
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION