Enviando JSON - Django
Em Django, o envio de dados no formato JSON é realizado através da classe JsonResponse
HttpResponse
JsonResponse
Content-Type
application/json
O construtor da classe possui os seguintes parâmetros:
def __init__(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)
: Dados a serem incluídos na resposta.data
: Um serializador utilizado para converter os dados em JSON. O padrão éencoder
.django.core.serializers.json.DjangoJSONEncoder
: Indica se os dados enviados devem ser um dicionário (safe
). O valor padrão édict
. Quando definido comoTrue
, permite a serialização de qualquer tipo de objeto.False
: Um dicionário de argumentos adicionais que será passado para a funçãojson_dumps_params
para personalizar a geração do JSON.json.dumps()
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
age
Serialização de Objetos Personalizados
Por padrão, o JsonResponse
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
Person
name
age
Person
safe
False
encoder
PersonEncoder
A classe PersonEncoder
django.core.serializers.json.DjangoJSONEncoder
default
Person
return {"name": obj.name, "age": obj.age}
Como alternativa, é possível usar o atributo especial __dict__
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
default