Enviando JSON no 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 comoFalse
, permite a serialização de qualquer tipo de objeto.json_dumps_params
: Um dicionário de argumentos adicionais que será passado para a funçãojson.dumps()
para personalizar a criaçã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.
Documentação oficial: