Django使用serializers序列化模型返回JSON被转为字符串如何解决
问题原因
你调用django.core.serializers.serialize('json', 实例)的时候,得到的data已经是JSON格式的字符串了。而JsonResponse的作用是把Python原生对象(字典、列表等)序列化为JSON响应,所以你把JSON字符串传给它的话,它会对这个字符串做二次序列化,最终返回的就是带转义符的字符串格式结果,和你预期的不符。
解决方案
方案1:反序列化后再用JsonResponse返回
把serialize得到的JSON字符串先通过json.loads转成Python列表对象,再交给JsonResponse处理,修改view里的代码如下:
def infiniteScroll(request, room_name): dateFilter=request.GET.get('date') dateFilter=dateFilter[5:len(dateFilter)-4] dateFilter=datetime.strptime(dateFilter, '%d %b %Y %H:%M:%S') # 序列化得到JSON字符串 json_str = serializers.serialize('json', reversed(Messages.objects.filter(room=room_name).filter(date_added__lt=dateFilter).order_by('-date_added')[:2])) # 转成Python原生列表对象 data = json.loads(json_str) return JsonResponse(data, safe=False)
方案2:直接用HttpResponse返回序列化结果
既然已经拿到了合法的JSON字符串,直接作为响应体返回,指定响应头的内容类型为JSON即可,代码如下:
from django.http import HttpResponse def infiniteScroll(request, room_name): dateFilter=request.GET.get('date') dateFilter=dateFilter[5:len(dateFilter)-4] dateFilter=datetime.strptime(dateFilter, '%d %b %Y %H:%M:%S') data=serializers.serialize('json', reversed(Messages.objects.filter(room=room_name).filter(date_added__lt=dateFilter).order_by('-date_added')[:2])) # 直接返回JSON字符串,指定内容类型 return HttpResponse(data, content_type='application/json')
两种方案都可以得到你预期的JSON结构,第一种更符合Django返回JSON响应的常规写法,第二种性能略好,少了一次序列化/反序列化的过程。
内容的提问来源于stack exchange,提问作者Adi Putra
相关产品推荐
相关产品推荐

