请牛B的大虾帮忙解决一个方案我在josnp数据请求中,如何对返回的数据进行修改,修改成我需要的格式。。如果有人遇到过相同的问题麻烦分享下。。

解决方案 »

  1.   

    你为什么要修改返回的数据,你需要什么数据就返回什么数据。
    真要修改的话,debug在store.proxy.reader.jsonData下面应该是你想要拿到的数据
      

  2.   

    楼主你的问题我以前遇到过,因json数据格式不符而不能得到想要的值是吧?
    我当时情况是想要的值被放到json子层而不好取值,比如:
    [{"pk": 1, "model": "database.job","fields": {"job_name":"myname","title":......}}]后来查了半天在国外一些论坛那发现有两种解决办法:一种是在服务器端设置,(我用的是django):
    1-1.定义Serialize# webapp.json.serializer
    from django.core import serializersdef 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# webapp.jobs.view
    from django.http import HttpResponse
    from webapp.json.serializer import Serialize
    from webapp.jobs.models import Jobdef json_job_list(request):
        return HttpResponse(Serialize(Job.objects.all(), root_name='job'), mimetype='text/javascript') ————————————————————————————————
    2-1或者用此简化方法代替1# webapp.genericviewsfrom django.shortcuts import render_to_response
    from django.template import loader, RequestContext
    from django.http import HttpResponse
    from webapp.json.serializer import Serializedef json_simple_serialize(request, queryset, root_name=None):
        return HttpResponse(Serialize(queryset, root_name=root_name), mimetype='text/javascript')  2-2.l# webapps.jobs.urlsfrom django.conf.urls.defaults import *
    from webapp.genericviews import json_simple_serialize
    from webapp.jobs.models import Jobjobs_info_dict = {
        'queryset':Job.objects.all(),
        'root_name': 'jobs', 
    }
    urlpatterns = patterns('',
        (r'json/jobs/', json_simple_serialize, jobs_info_dict),
    )  
    第二种是在前台客户端设置,这里我发现还有两种子方法:
    一种是自己写个function,然后套用这个function: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
        };
        }
    });
    然后套用的时候这样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去读,虽然传过来的格式不符合(你需要的值在子层),但还是有办法读到的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'}
        ])
    });  
    我是用前台的第二种方法解决的此问题