Django框架中使用json格式序列化与反序列化QuerySet和Model
2012-06-06 19:00
597 查看
转自:http://cyfloel0516.sinaapp.com/?tag=django
Django框架默认集成的是SimpleJson这个Python库,这个库在日常的Json序列化与反序列化已经完全足够,但是一旦涉及到复杂的对象(例如ORM框架上的持久化类)就会有点捉襟见肘。
下面总结问题和解决方案:(统一使用Django的单元测试来进行测试)
1.对象的序列化和反序列化。
首先,SimpleJson完全不支持对象的序列化与反序列化,如果要实现对象的序列化和反序列化,则需要在simplejson的dumps和loads两个方法中去添加参数,分别指明自定义的序列化和反序列化规则(这里的规则泛指方法或者一个类)。只有指定了规则,simplejson才能够知道如何将一个对象序列化为一个字典(dict),反之亦然。因此,解决方法可以使用Django内置的序列化和反序列化工具。这样一来,就可以序列化ORM所查询到的QuerySet对象集合了。
2.使用Django内置的序列化工具只能够序列化对象集合,想在序列化过程中添加一些额外的需要序列化的信息。
例如,在网络传输时,不但要传输对象集合,还需要传输一些额外的信息,例如标识结果的字符串result=”success”,这样一来就不能仅仅使用Django内置的序列化工具,而只能使用Python所有的SimpleJson库,而悖论的地方在于SimpleJson不支持序列化对象集合,因此,就需要对SimpleJson的方法进行一些加工。这里就是使用simplejson.dumps()方法所有的cls这个参数来指定自定义自己的序列化处理类。
3.序列化或反序列化单个对象
Django的序列化工具只支持对象集合,因此需要做一些取巧的手段来完成序列化或者反序列化单个对象。
下面贴出解决方案的代码,详细的注释在代码中:
在上面的例子中,自定义了一个序列化规则类MyEncoder,用来处理集合或者集合对象,然后实现了一个可变参数的工具方法getJson,用于传入多个参数,并将其一同序列化。另外还有一个反序列化对象的方法jsonBack,接受一个代表对象或者对象集合的json而返回一个对象集合。这样一来就可以很好的使用配合SimpleJson和Django来完成序列化工作了。
Django框架默认集成的是SimpleJson这个Python库,这个库在日常的Json序列化与反序列化已经完全足够,但是一旦涉及到复杂的对象(例如ORM框架上的持久化类)就会有点捉襟见肘。
下面总结问题和解决方案:(统一使用Django的单元测试来进行测试)
1.对象的序列化和反序列化。
首先,SimpleJson完全不支持对象的序列化与反序列化,如果要实现对象的序列化和反序列化,则需要在simplejson的dumps和loads两个方法中去添加参数,分别指明自定义的序列化和反序列化规则(这里的规则泛指方法或者一个类)。只有指定了规则,simplejson才能够知道如何将一个对象序列化为一个字典(dict),反之亦然。因此,解决方法可以使用Django内置的序列化和反序列化工具。这样一来,就可以序列化ORM所查询到的QuerySet对象集合了。
2.使用Django内置的序列化工具只能够序列化对象集合,想在序列化过程中添加一些额外的需要序列化的信息。
例如,在网络传输时,不但要传输对象集合,还需要传输一些额外的信息,例如标识结果的字符串result=”success”,这样一来就不能仅仅使用Django内置的序列化工具,而只能使用Python所有的SimpleJson库,而悖论的地方在于SimpleJson不支持序列化对象集合,因此,就需要对SimpleJson的方法进行一些加工。这里就是使用simplejson.dumps()方法所有的cls这个参数来指定自定义自己的序列化处理类。
3.序列化或反序列化单个对象
Django的序列化工具只支持对象集合,因此需要做一些取巧的手段来完成序列化或者反序列化单个对象。
下面贴出解决方案的代码,详细的注释在代码中:
from django.utils import simplejson from django.db import models from django.core.serializers import serialize,deserialize from django.db.models.query import QuerySet from django.test import TestCase class MyEncoder(simplejson.JSONEncoder): """ 继承自simplejson的编码基类,用于处理复杂类型的编码 """ def default(self,obj): if isinstance(obj,QuerySet): """ Queryset实例 直接使用Django内置的序列化工具进行序列化 但是如果直接返回serialize('json',obj) 则在simplejson序列化时会被从当成字符串处理 则会多出前后的双引号 因此这里先获得序列化后的对象 然后再用simplejson反序列化一次 得到一个标准的字典(dict)对象 """ return simplejson.loads(serialize('json',obj)) if isinstance(obj,models.Model): """ 如果传入的是单个对象,区别于QuerySet的就是 Django不支持序列化单个对象 因此,首先用单个对象来构造一个只有一个对象的数组 这是就可以看做是QuerySet对象 然后此时再用Django来进行序列化 就如同处理QuerySet一样 但是由于序列化QuerySet会被'[]'所包围 因此使用string[1:-1]来去除 由于序列化QuerySet而带入的'[]' """ return simplejson.loads(serialize('json',[obj])[1:-1]) if hasattr(obj, 'isoformat'): #处理日期类型 return obj.isoformat() return simplejson.JSONEncoder.default(self,obj) def jsonBack(json): """ 进行Json字符串的反序列化 一般来说,从网络得回的POST(或者GET) 参数中所包含json数据 例如,用POST传过来的参数中有一个key value键值对为 request.POST['update'] = "[{pk:1,name:'changename'},{pk:2,name:'changename2'}]" 要将这个value进行反序列化 则可以使用Django内置的序列化与反序列化 但是问题在于 传回的有可能是代表单个对象的json字符串 如: request.POST['update'] = "{pk:1,name:'changename'}" 这是,由于Django无法处理单个对象 因此要做适当的处理 将其模拟成一个数组,也就是用'[]'进行包围 再进行反序列化 """ if json[0] == '[': return deserialize('json',json) else: return deserialize('json','[' + json +']') def getJson(**args): """ 使用MyEncoder这个自定义的规则类来序列化对象 """ result = dict(args) return simplejson.dumps(result,cls=MyEncoder)
在上面的例子中,自定义了一个序列化规则类MyEncoder,用来处理集合或者集合对象,然后实现了一个可变参数的工具方法getJson,用于传入多个参数,并将其一同序列化。另外还有一个反序列化对象的方法jsonBack,接受一个代表对象或者对象集合的json而返回一个对象集合。这样一来就可以很好的使用配合SimpleJson和Django来完成序列化工作了。
相关文章推荐
- Django model,QuerySet 序列化成json的方法
- 两种方法在Django框架中支持后台返回包含中文的JSON/数组格式
- Json序列化框架之Gson使用方法
- java 常用序列化和反序列化框架使用-json,kyro,jdk
- EXT中在前台使用ajax将后台model类封装为json格式传到前台,并且解析出model中属性
- django 将model转换成想要都json格式
- Java对象的序列化与反序列化:默认格式及JSON格式(使用jackson)
- 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、&并且——queryset对象序列化
- PythonWeb开发Django框架学习(九)使用Model类操作数据库数据
- Json.Net 使用属性定义日期的序列化格式
- 在ssm框架中前后台数据交互均使用json格式
- Django model序列化为json的方法示例
- 在ASP.NET MVC中使用Knockout实践04,控制View Model的json格式内容
- 解决如下json格式的字符串不能使用DataContractJsonSerializer序列化和反序列化
- JSON格式数据解析及GSON框架的使用详解
- 使用spring-mvc 框架返回json格式数据 报406
- C#使用DataContractJsonSerializer实现Json格式的序列化和反序列化
- SSH三大框架集成中,使用jQuery框架 Ajax技术返回json格式的数据(二)
- java对象序列化与反序列化的默认格式和json格式使用示例
- iOS端JSON转Model链式编程框架SuperKVC使用方法与原理