Atualizado: 14/12/2024

Enviando JSON - Django

Em Django, o envio de dados no formato JSON é realizado através da classe JsonResponse, uma subclasse de HttpResponse. A principal característica do JsonResponse é configurar automaticamente o cabeçalho Content-Type como application/json, indicando que o conteúdo retornado está no formato JSON.

O construtor da classe possui os seguintes parâmetros:

def __init__(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)
  • data: Dados a serem incluídos na resposta.

  • encoder: Um serializador utilizado para converter os dados em JSON. O padrão é django.core.serializers.json.DjangoJSONEncoder.

  • safe: Indica se os dados enviados devem ser um dicionário (dict). O valor padrão é True. Quando definido como False, permite a serialização de qualquer tipo de objeto.

  • json_dumps_params: Um dicionário de argumentos adicionais que será passado para a função json.dumps() para personalizar a geração do JSON.

O exemplo abaixo demonstra como retornar um dicionário simples como JSON em uma view:

from django.http import JsonResponse

def index(request):
    return JsonResponse({"name": "Tom", "age": 38})

Neste exemplo, o dicionário contendo as chaves name e age é enviado como resposta. Ao acessar a URL associada à função index no navegador, o JSON com esses dados será exibido.

Serialização de Objetos Personalizados

Por padrão, o JsonResponse aceita apenas dicionários como entrada. Para serializar objetos de tipos personalizados, é necessário criar uma classe de serialização que define como esses objetos serão convertidos em JSON.

O exemplo a seguir demonstra como serializar uma instância de uma classe chamada Person:

from django.http import JsonResponse
from django.core.serializers.json import DjangoJSONEncoder

def index(request):
    bob = Person("Bob", 41)
    return JsonResponse(bob, safe=False, encoder=PersonEncoder)

class Person:
    def __init__(self, name, age):
        self.name = name  # Nome da pessoa
        self.age = age    # Idade da pessoa

class PersonEncoder(DjangoJSONEncoder):
    def default(self, obj):
        if isinstance(obj, Person):
            return {"name": obj.name, "age": obj.age}
        return super().default(obj)

No exemplo acima, um objeto da classe Person é enviado como JSON. A classe Person possui dois atributos, name e age. Como Person não é um dicionário, o parâmetro safe deve ser definido como False. O parâmetro encoder indica o serializador a ser utilizado, que nesse caso é a classe PersonEncoder.

A classe PersonEncoder herda de django.core.serializers.json.DjangoJSONEncoder e sobrescreve o método default, que define como o objeto será convertido em JSON. Se o objeto for uma instância de Person, ele é transformado em um dicionário com os atributos relevantes:

return {"name": obj.name, "age": obj.age}

Como alternativa, é possível usar o atributo especial __dict__ do objeto para gerar um dicionário automaticamente:

return obj.__dict__

Isso pode simplificar o código, mas pode não ser adequado em situações onde ajustes específicos na serialização são necessários.

Se o objeto não for do tipo Person, ele é passado para a implementação do método default da classe base.

Navegador exibindo JSON retornado pelo servidor Django
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com