Extjs4.0 jsonp数据请求求助 请牛B的大虾帮忙解决一个方案我在josnp数据请求中,如何对返回的数据进行修改,修改成我需要的格式。。如果有人遇到过相同的问题麻烦分享下。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你为什么要修改返回的数据,你需要什么数据就返回什么数据。真要修改的话,debug在store.proxy.reader.jsonData下面应该是你想要拿到的数据 楼主你的问题我以前遇到过,因json数据格式不符而不能得到想要的值是吧?我当时情况是想要的值被放到json子层而不好取值,比如:[{"pk": 1, "model": "database.job","fields": {"job_name":"myname","title":......}}]后来查了半天在国外一些论坛那发现有两种解决办法:一种是在服务器端设置,(我用的是django):1-1.定义Serialize# webapp.json.serializerfrom 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.viewfrom django.http import HttpResponsefrom webapp.json.serializer import Serializefrom 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_responsefrom django.template import loader, RequestContextfrom django.http import HttpResponsefrom 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_serializefrom 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'} ])}); 我是用前台的第二种方法解决的此问题 求教 AJAX 以及JQUERY问题 谢谢 js给结构体数组赋值 自动投票,服务器alert返回如何处理! 求教:EXT GRID保存時驗證日期格式 想详细了解下JAVA和JS实现一棵树的过程,包括后台和前台JS解析,跪求提供,谢谢 腾讯RTX 关于style="position:absolute;"导致的问题 如何不让用户用MOUSE右健及Ctrl+C, 及IE菜单 怎样使鼠标箭头形状变成沙漏的形状? 怎么跟踪table键????????????????????????? 如何用jquery获得select变更之前的值 看不懂这段代码,谁能给解释下
真要修改的话,debug在store.proxy.reader.jsonData下面应该是你想要拿到的数据
我当时情况是想要的值被放到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'}
])
});
我是用前台的第二种方法解决的此问题