在josnp数据请求中,如何将返回的数据修改成自己需要的格式
一种是在服务器端设置(用的是django):
1-1.定义Serialize
Python code
# webapp.json.serializer
from django.core import serializers
def Serialize(queryset, root_name=None):
if not root_name:
root_name = queryset.model._meta.verbose_name_plural
return '{"total": %s, "%s": %s}' %
(queryset.count(), root_name, serializers.serialize('json', queryset))
1-2应用Serialize
Python code
# webapp.jobs.view
from django.http import HttpResponse
from webapp.json.serializer import Serialize
from webapp.jobs.models import Job
def json_job_list(request):
return HttpResponse(Serialize(Job.objects.all(), root_name='job'), mimetype='text/javascript')
————————————————————————————————
2-1或者用此简化方法代替1
Python code
# webapp.genericviews
from django.shortcuts import render_to_response
from django.template import loader, RequestContext
from django.http import HttpResponse
from webapp.json.serializer import Serialize
def json_simple_serialize(request, queryset, root_name=None):
return HttpResponse(Serialize(queryset, root_name=root_name), mimetype='text/javascript')
2-2.l
Python code
# webapps.jobs.urls
from django.conf.urls.defaults import *
from webapp.genericviews import json_simple_serialize
from webapp.jobs.models import Job
jobs_info_dict = {
'queryset':Job.objects.all(),
'root_name': 'jobs',
}
urlpatterns = patterns('',
(r'json/jobs/', json_simple_serialize, jobs_info_dict),
)
第二种是在前台客户端设置,这里还有两种子方法:
一种是自己写个function,然后套用这个function:
JScript code
Ext.data.DjangoJsonReader = function(meta, recordType){
Ext.data.DjangoJsonReader.superclass.constructor.call(this, meta, recordType);
};
Ext.extend(Ext.data.DjangoJsonReader, Ext.data.JsonReader, {
readRecords : function(o){
this.jsonData = o;
var s = this.meta;
var sid = s.id;
var recordType = this.recordType, fields = recordType.prototype.fields;
var totalRecords = 0;
if(s.totalProperty){
var v = parseInt(eval("o." + s.totalProperty), 10);
if(!isNaN(v)){
totalRecords = v;
}
}
var records = [];
var root = s.root ? eval("o." + s.root) : o;
for(var i = 0; i < root.length; i++){
var n = root[i];
var values = {};
var id = (n[sid] !== undefined && n[sid] !== "" ? n[sid] : n['pk']);
for(var j = 0, jlen = fields.length; j < jlen; j++){
var f = fields.items[j];
var map = f.mapping || f.name;
var v = n['fields'][map] !== undefined ? n['fields'][map] : f.defaultValue;
v = f.convert(v);
values[f.name] = v;
}
var record = new recordType(values, id);
record.json = n;
records[records.length] = record;
}
return {
records : records,
totalRecords : totalRecords || records.length
};
}
});
然后套用的时候这样
JScript code
var ds = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({url: "/json/jobs/"}),
reader: new Ext.data.DjangoJsonReader({
root: 'jobs',
totalProperty: 'total'
}, [
{name: 'job_name'},
{name: 'status'}
])
});
另一种是直接应用DjangoJsonReader去读,虽然传过来的格式不符合(你需要的值在子层),但还是有办法读到的
JScript code
ds = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({url: "/json/jobs/"}),
reader: new Ext.data.JsonReader({
root: 'jobs',
totalProperty: 'total',
id: 'pk'
}, [
{name: 'job_name', mapping: 'fields.job_name'},
{name: 'status', mapping: 'fields.status'}
])
});