目前,web系统在前后端分离,通过API通信的大环境下,JSON序列化是后端必不可少的工作,在Jango中常用的序列化方案有多种,我很好奇它们之间有何种区别,什么情况下性能最佳,于是有了这次的调研。
- 首先弄清楚什么是序列化:
python已经集成了自己的序列化模块,如 json,其中的 json.dumps、和json.loads,就能实现字典和json字符串的转换。
实际上所谓的序列化,就是将字典转换成符合字典格式的字符串,反序列化则就是将其倒过来。
# type:dict
dict_object = {"id": 1, "name": "王二狗", "age": 18}
# type:str
json_str = '{"id": 1, "name": "王二狗", "age": 18}'
- 介绍序列化方案前,展示下我定义的model:
from django.db import models
class PersonInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
age = models.IntegerField()
hireDate = models.DateField()
def __str__(self):
return str(self.id)
class Meta:
verbose_name = '人员信息'
class Vocation(models.Model):
id = models.AutoField(primary_key=True)
job = models.CharField(max_length=20)
title = models.CharField(max_length=20)
payment = models.IntegerField()
name_id = models.IntegerField()
def __str__(self):
return str(self.id)
class Meta:
verbose_name = '职业信息'
- Djano中自带的序列化方案和常见的第三方序列化方案:
- JsonResponse
- from django.core import serializers
- from rest_framework import serializers
其中,前两种,是Django自带的序列化方案,后者则是rest_framwork中所带的序列化方案,当然想要序列化还有很多方案,这里只列出几种常用的。
- 基础介绍:
JsonResponse 使用起来十分简单,只要将你要返回的内容以字典的形式传入其中,就能给前端返回相对应的Json字符串,如下图。
class TestView(View):
sql = "SELECT * FROM index_vocation"
column_list = ['id', 'job', 'title', 'payment', 'name_id']
def get(self, request):
raws, sql_code = django_sql(self.sql, dict_keys=self.column_list, types='list_dict')
return JsonResponse(data={'data': raws}, json_dumps_params={'ensure_ascii': False}, status=sql_code)
其中的django_sql是我自己封装的一个数据库查询模块,它会执行SQL,并将结果格式化成:列表包裹着字典的形式 [{}...],结果如下:
这里需要注意的是,json_dumps_params={'ensure_ascii': False} 这个参数,如果不关闭的话,它会将返回参数中的中文,转换成ascii码。
from django.core import serializers:
serializers是django中自带的序列化方法,用法如下:
class TestViewDjango(View):
def get(self, request):
result = Vocation.objects.all()
data = serializers.serialize('json', result, ensure_ascii=False)
return HttpResponse(content=data, status=200)
serializers.serialize() 的必填参数有两个。其一是你需要序列化的格式,输入的是字符串,这里用的是json,此外还支持xml等格式的转换。其二是你需要转换的内容,必须是一个