django提供了基于json,yaml,xml的串行化支持. 这里我们主要来讲json django对json 的支持有两个层次 第一个层次在django.utils.simplejson包中 ,JSONEncoder 提供了常见python数据类型像tuple,list,dict,string,float,decimal等的支持,但这里,并不包含对自定义python对象的json支持 第二个层次在django.core.serializers 包中,这个包提供了对json,yaml(如果你安装了pyyaml的话,xml的串行化支持. 注意,在这里,只能串行化querySet,而且,你只能在django项目内部使用(当然你可以通过手动将项目路径加入到sys.path并设置 os.environ["DJANGO_SETTINGS_MODULE"] = myproject.settings' 来在非django项目中使用)
第一个层次可以在其他非django 项目中使用,你需要继承JSONEncoder,并覆盖default方法,比方说你有一个Employee对象
class Employee: def __init__(self,name): self.name=name
from django.utils.simplejson.encoder import JSONEncoder class ObjectJSONEncoder(JSONEncoder): def default(self,o): if hasattr(o,"__dict__") return o.__dict__ return super(ObjectJSONEncoder,self).default(o)
# test
data=[1,{'a':'a'},Employee('jjx')] import django.utils.simplejson
print django.utils.simplejson.dumps(data,cls=ObjectJSONEncoder)
[1, {"a": "a"}, {"name": "jjx"}]
当使用第二个层次时,你可以通过传递fields 参数选择输出的字段,也可以传入一个io对象
from django.core.serializers import seralize from cStringIO import StringIO stream=StringIO()
seralize('json',User.objects.all(),stream=stream,fields=['username']) print stream.getvalue()
当将json输出到浏览器时,你可以传递mimetype参数为text/json或text/javascript return HttpResponse(json_str,mimetype="text/json")
update django snippets 上有 个JsonResponse类, 可以参考 http://www.djangosnippets.org/snippets/154/
from django.core.serializers import serialize from django.db.models.query import QuerySet from django.http import HttpResponse from django.utils import simplejson
class JsonResponse(HttpResponse): def __init__(self, object): if isinstance(object, QuerySet): content = serialize('json', object) else: content = simplejson.dumps(object) super(JsonResponse, self).__init__(content, mimetype='application/json') |