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: