我正在使用查询执行ajax请求,并想知道为什么我的响应已经是JS对象。
如果我做了
var obj = jQuery.parseJSON(response);
'obj'为null,但我可以将'response'用作js对象的数组。
这不是一个真正的问题,但我想了解这种行为。
由于
答案 0 :(得分:10)
当您进行AJAX调用并指定dataType时,会发生这种情况.JSON jQuery会在响应中为您调用jQuery.parseJSON。实际上,您可以根据数据类型指定要调用的函数,您可以从documentation
中指定转换器(增加1.5)
Map默认值:{“* text”:window.String,“text html“:true,”text json“:jQuery.parseJSON,”text xml“: jQuery.parseXML} dataType-to-dataType转换器的映射。每 converter的值是一个返回转换后的值的函数 回应
所以如果你打这样的电话
$.ajax({
url: yoururl,
dataType: "json",
success: function(data){
//data is already a json
}
如果你没有指定dataType,jQuery会尝试猜测它
dataTypeString默认值:智能猜测(xml,json,脚本或 html)
您期望从服务器返回的数据类型。如果没有 如果指定,jQuery将尝试根据MIME类型推断它 响应(XML MIME类型将产生XML,在1.4 JSON中将产生 一个JavaScript对象,在1.4脚本中将执行脚本,和 其他任何东西都将作为字符串返回)。可用的类型(和 作为成功回调的第一个参数传递的结果是:
“xml”:返回可以通过jQuery处理的XML文档 “html”:以纯文本形式返回HTML;包含的脚本标记被评估 插入DOM时。 “script”:将响应评估为 JavaScript并将其作为纯文本返回。通过附加禁用缓存 除非缓存,否则查询字符串参数“ = [TIMESTAMP]”到URL 选项设置为true。注意:这会将POST转换为GET 远程域请求。 “json”:将响应评估为JSON和 返回一个JavaScript对象。在jQuery 1.4中,解析了JSON数据 严谨的态度;任何格式错误的JSON都会被拒绝,并且会出现解析错误 抛出。 (有关正确JSON格式的更多信息,请参阅json.org。)
“jsonp”:使用JSONP加载JSON块。添加一个额外的 “?回调=?”到URL的末尾以指定回调。禁用 通过将查询字符串参数“ = [TIMESTAMP]”附加到 除非缓存选项设置为true,否则为URL “text”:纯文本 串。多个空格分隔的值:
从jQuery 1.5开始,jQuery就可以了 将dataType从Content-Type标头中收到的数据转换为 你需要什么。例如,如果您想要文本响应 作为XML处理,使用“text xml”作为dataType。你也可以做一个 JSONP请求,将其作为文本接收,并由jQuery解释为 XML:“jsonp text xml。”同样,一个速记字符串,如“jsonp xml“将首先尝试从jsonp转换为xml,并且失败 那,从jsonp转换为文本,然后从文本转换为xml。
答案 1 :(得分:4)
这几乎取决于你传递给jQuery ajax请求的dataType
。调用.getJSON()
或直接使用$.ajax()
可能会发生这种情况。
但是,如果省略dataType
,jQuery会尝试做一些魔术并猜测收到了哪些数据。 对于JSON数据,它使用一个简单的正则表达式来检查响应是否看起来像一个JSON字符串,如果是,它会自动为你解析它。
jQuery将尝试根据响应的MIME类型推断它。
因此,请务必准确地告诉jQuery您期望的数据类型。
答案 2 :(得分:2)
jQuery的ajax方法的默认行为是分析响应并将其作为最合适的数据类型返回。因此,如果您的响应看起来像JSON,它将被转换为JavaScript对象/数组。
您可以通过在ajax设置中设置dataType
属性来覆盖此行为。
答案 3 :(得分:2)
如果您将dataType
指定为json
,则jquery会为您解析响应
$.ajax({
...
dataType:'json',
...
});
的情况也是如此
getJSON
的源代码如下所示
getJSON: function( url, data, callback ) {
return jQuery.get( url, data, callback, "json" );
},
https://github.com/jquery/jquery/blob/master/src/ajax.js#L283
答案 4 :(得分:1)
由于
jQuery.ajaxSettings.converters["text json"] === jQuery.parseJSON
I.E每次自动检测json响应或自行设置
时,它都会运行该功能