在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'}

    ])

}); 

 

 

posted on 2012-06-18 17:36  Julyvv  阅读(492)  评论(0编辑  收藏  举报