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