Javascript 使用Prototype解析JSON结果时出现问题
我的服务返回以下JSON对象,内容类型头设置为“application/javascript”。根据json.org上的说明,它被包装在parens中),但我尝试过使用和不使用parens。如果没有parens,它将通过来自的验证 如果我显式地评估响应,如下所示,我没有问题:Javascript 使用Prototype解析JSON结果时出现问题,javascript,json,prototype,Javascript,Json,Prototype,我的服务返回以下JSON对象,内容类型头设置为“application/javascript”。根据json.org上的说明,它被包装在parens中),但我尝试过使用和不使用parens。如果没有parens,它将通过来自的验证 如果我显式地评估响应,如下所示,我没有问题: var form = $('productListRequestForm'); form.request({ onSuccess: function(response) { var json = eval(re
var form = $('productListRequestForm');
form.request({
onSuccess: function(response) {
var json = eval(response.responseText);
rebuildWishlistTable(json);
},
onFailure: function(response) {
alert("AJAX request failed: " + response.responseText);
}
});
但是,如果我依赖于原型解析响应并将解析结果作为第二个参数传递给我的函数(如下所示),则该值始终为null。根据该报告,这应该是可行的。是我遗漏了什么,还是他们遗漏了什么
var form = $('productListRequestForm');
form.request({
onSuccess: function(response, json) {
rebuildWishlistTable(json);
},
onFailure: function(response) {
alert("AJAX request failed: " + response.responseText);
}
});
用括号括起来
eval("({\"products\"": {\"itemId\": \"0\", \"productId\": \"1234\", \"quantity\": \"4\", \"rank\": \"12\", \"subProductId\": \"\"}, \"txnId\": \"1\"})")
这对你很有用用括号括起来
eval("({\"products\"": {\"itemId\": \"0\", \"productId\": \"1234\", \"quantity\": \"4\", \"rank\": \"12\", \"subProductId\": \"\"}, \"txnId\": \"1\"})")
这对你来说是可行的它看起来像是原型中的一个bug 在修订版1.6.1的第1497行,有以下代码:
var contentType = response.getHeader('Content-type');
if (this.options.evalJS == 'force'
|| (this.options.evalJS && this.isSameOrigin() && contentType
&& contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
this.evalResponse();
请注意,从evalResponse()
返回的内容不做任何处理。如果我们接着讨论该函数的定义:
evalResponse: function() {
try {
return eval((this.transport.responseText || '').unfilterJSON());
} catch (e) {
this.dispatchException(e);
}
},
在原型网站上发布了一个bug,并以我对JSON有“几个误解”的评论结束,我不应该使用bug报告系统来获得帮助。有趣的是,我想我是在指出他们丢弃返回值的地方
如果其他人可能有类似的情况,我正在编辑我的问题,以显示有效和无效的代码,并将接受这个答案。这看起来像是原型中的一个bug 在修订版1.6.1的第1497行,有以下代码:
var contentType = response.getHeader('Content-type');
if (this.options.evalJS == 'force'
|| (this.options.evalJS && this.isSameOrigin() && contentType
&& contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
this.evalResponse();
请注意,从evalResponse()
返回的内容不做任何处理。如果我们接着讨论该函数的定义:
evalResponse: function() {
try {
return eval((this.transport.responseText || '').unfilterJSON());
} catch (e) {
this.dispatchException(e);
}
},
在原型网站上发布了一个bug,并以我对JSON有“几个误解”的评论结束,我不应该使用bug报告系统来获得帮助。有趣的是,我想我是在指出他们丢弃返回值的地方
如果其他人可能有类似的情况,我正在编辑我的问题,以显示有效和无效的代码,并将接受此答案。不,实际上没有。正如我在文章中所指出的,显式eval是有效的——正如我也注意到的,我将JSON封装在parens中来实现这一点。问题是Prototype的自动求值不起作用,不管JSON是否包装在parens中。不,实际上不起作用。正如我在文章中所指出的,显式eval是有效的——正如我也注意到的,我将JSON封装在parens中来实现这一点。问题是Prototype的自动求值不起作用,不管JSON是否用paren包装。