博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django,再谈json序列化
阅读量:2304 次
发布时间:2019-05-09

本文共 1839 字,大约阅读时间需要 6 分钟。

我们知道JSON字符串是目前流行的数据交换格式,在pyhton中我们通过json模块,将常用的数据类型转化为json字符串。但是,json支持转化的数据类型是有限的。

比如,我们通过ORM从数据库查询出的结果,试图通过json序列化:

from .models import UserInfodef index(request):    user_list = UserInfo.objects.all()    import json    return HttpResponse(json.dumps(user_list))    # TypeError: Object of type 'QuerySet' is not JSON serializable

报错,QuerySet不是JSON能序列化的对象。那么有什么办法可以解决呢?

注意,如果是通过values查询,如UserInfo.objects.values("name"),查询出来的结果虽然也是QuerySet对象,但是其结构是这样的:<QuerySet [{'name': 'egon'}, {'name': 'sb'}]>, 类似于列表套字典的结构。对于这种情况,我们可以通过list()方法将QuerySet 对象转化为列表,这样就可以直接用json.dumps()进行序列化了。

方法一:serializers

def index(request):    user_list = UserInfo.objects.all()    from django.core import serializers    user_list_json = serializers.serialize("json", user_list)    return HttpResponse(user_list_json)

将返回的结果放到校验结果如下:

[  {    "model": "app01.userinfo",    "pk": 1,        "fields": {        "name": "egon",        "pwd": "123"    }},{    "model": "app01.userinfo",    "pk": 2,    "fields": {        "name": "sb",        "pwd": "123"    }}]

注:pk代表主键(可以是默认的id主键字段,也可以是用户自定义的主键字段)

观察序列化结果,发现这种方式将服务端数据库的表名都暴露了;另外serializers不支持连表序列化,只能拿到另一张表的id。下面我们我们用一种新的方式。

方法二:自定义JSON处理器

查看json.dumps源码,发现序列化时,用到了一个参数cls = JSONEncoder,我们可以继承它,自定义一个类,重写它的default方法,来处理我们需要的数据类型。比如自定义对时间对象进行转化:

import jsonfrom datetime import datefrom datetime import datetimeclass JsonCustomEncoder(json.JSONEncoder):    def default(self, field):        if isinstance(field, datetime):            return field.strftime('%Y-%m-%d %H:%M:%S')        elif isinstance(field, date):            return field.strftime('%Y-%m-%d')        else:            return json.JSONEncoder.default(self, field)

下面我们试着序列化一个datetime对象:

def index(request):    now = datetime.now()    import json    return HttpResponse(json.dumps(now, cls=JsonCustomEncoder))

再次访问http://127.0.0.1:8000/index.html:

1.png

是不是成功处理了呢

你可能感兴趣的文章
java进阶6——集合
查看>>
java进阶7——异常
查看>>
java进阶8——IO流
查看>>
java进阶9——线程
查看>>
java进阶10——面向网络编程
查看>>
java进阶11——反射&BeanUtils
查看>>
PUSQL学习1——PUSQL 基础
查看>>
JavaWeb文件上传
查看>>
解决tomcat内存不足问题:java.lang.OutOfMemoryError: PermGen space
查看>>
JDBC连接常用数据库的URL
查看>>
iReport 按某个字段(属性)值分页打印
查看>>
矢量图控件VectorDraw使用教程:添加vdFramedControl (Visual C# 2005)
查看>>
矢量图控件VectorDraw使用教程:ActionUtility对象
查看>>
使用Dynamsoft存储和检索SQL Server中的扫描图像
查看>>
分享30个最流行的jQuery插件(上)
查看>>
分享30个最流行的jQuery插件(下)
查看>>
10款最出色的免费数据库管理工具
查看>>
26款开源Java测试工具
查看>>
4款.Net报表控件优势对比分析
查看>>
FusionCharts与Highcharts图表类型对比
查看>>