为什么'jQuery.parseJSON'没有必要?

时间:2012-02-02 11:02:01

标签: javascript ajax jquery

我正在使用查询执行ajax请求,并想知道为什么我的响应已经是JS对象。

如果我做了

var obj = jQuery.parseJSON(response);

'obj'为null,但我可以将'response'用作js对象的数组。

这不是一个真正的问题,但我想了解这种行为。

由于

5 个答案:

答案 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',
...
});

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

答案 4 :(得分:1)

由于

jQuery.ajaxSettings.converters["text json"] === jQuery.parseJSON

I.E每次自动检测json响应或自行设置

时,它都会运行该功能