Categories

Links

django小提示-json

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')

[2007-11-28 16:37:21 | jiangjianxiao]

comments


Powered by Google App Engine