为什么'jQuery.parseJSON'不是必需的?

问题描述:

我正在做一个查询ajax请求,并想知道为什么我的响应已经是一个JS对象。为什么'jQuery.parseJSON'不是必需的?

如果我在

var obj = jQuery.parseJSON(response); 

“OBJ”为空,但我可以使用“响应”作为JS对象的数组。

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

感谢

出现这种情况,当你做一个AJAX调用,并指定具体的数据类型JSON的jQuery对您回应称jQuery.parseJSON。事实上,你可以指定取决于你本身可以从documentation

转换器(加1.5)具体的数据类型
地图默认调用什么功能:{“*文”:window.String,“文本 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 
    } 

呼叫如果不指定数据类型的jQuery试图猜测到底

dataTypeString默认:智能猜测(XML,JSON,脚本或 HTML)

您希望从服务器返回的数据类型。如果没有指定 ,那么jQuery将尝试根据 的MIME类型推断它的响应(一个XML MIME类型将产生XML,在1.4 JSON中将产生 一个JavaScript对象,在1.4脚本中将执行该脚本,并且 其他任何东西都会以字符串形式返回)。可用类型( 作为成功回调的第一个参数传递的结果)为:

“xml”:返回可以通过jQuery处理的XML文档。
“html”:将HTML作为纯文本返回;包含的脚本标记在插入DOM时评估为 。 “脚本”:将响应评估为 JavaScript并将其作为纯文本返回。除非缓存 选项设置为true,否则通过将 查询字符串参数“= [TIMESTAMP]”附加到URL来禁用缓存。注意:这会将POST转变为GET的 远程域请求。 “json”:将响应评估为JSON,并返回一个JavaScript对象。在jQuery 1.4中,JSON数据以严格的方式在 中解析;任何格式不正确的JSON都会被拒绝,并且抛出一个解析错误 。 (有关正确的JSON格式的更多信息,请参阅json.org。)
“jsonp”:使用JSONP加载JSON块。添加额外的 “?callback =?”到您的URL的末尾来指定回调。除非缓存选项设置为true,否则通过在 URL中附加查询字符串参数“
= [TIMESTAMP]”来禁用 缓存。
“text”:纯文本 字符串。多个空格分隔的值:
从jQuery 1.5开始,jQuery可以从 将ContentType类型标头中收到的数据类型转换为您需要的 。例如,如果您希望将文本响应设置为 ,那么将“text xml”用作dataType。您还可以创建一个 JSONP请求,将其作为文本接收,并由jQuery解释为 XML:“jsonp text xml”。同样,诸如“jsonp xml”这样的简写字符串将首先尝试从jsonp转换为xml,并且,失败 即从jsonp转换为文本,然后从文本转换为xml。

+2

此外,服务器还可以将'Content-Type'头部设置为'application/json',而jQuery将*最佳猜测*响应格式。 – Matt 2012-02-02 11:04:21

+0

“*当然你必须设置正确的头文件服务器端*”是不正确的。 jQuery *信任*你设置了'dataType'。它只检查标题是否必须*最好猜测*。 – Matt 2012-02-02 11:11:03

+0

@Matt好吧我会改变这个 – 2012-02-02 11:13:55

因为

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

IE它将运行功能,每次JSON响应,自动或明确检测自己设置

+0

这不是“*原因*”为什么对象返回。这使得* *可以返回对象(因为现在有一个转换器来自'* - > text',然后是'text - > json'),但它是'dataType'或者最好的猜测。转换。 – Matt 2012-02-02 11:15:17

+0

@Matt是的,如果你让这个函数返回“hello”,所有检测到的响应json都会返回“hello”给你。我正在使用它来对所有响应中的(;;);'进行预处理。 – Esailija 2012-02-02 11:18:41

jQuery的AJAX方法的默认行为是分析响应并返回作为最合适的数据类型。如果您的响应看起来像JSON,那么它将被转换为JavaScript对象/数组。

您可以通过在ajax设置中设置dataType属性来覆盖此行为。

这几乎取决于您将哪个dataType传递给您的jQuery ajax请求。这可能通过调用.getJSON()或直接使用$.ajax()来发生。

但是,如果您省略dataType,jQuery会尝试做一些魔术并猜测接收到哪些数据。 对于JSON数据,它使用简单的正则表达式来检查响应是否看起来像JSON字符串,如果是,它会自动为您解析它。 jQuery将尝试根据响应的MIME类型推断它。

因此,一定要确切地告诉jQuery您期望的数据类型。

+1

它只是检查内容类型的头或重写MIME类型,没有解析的响应内容,看看它是什么类型 – Esailija 2012-02-02 11:08:34

+0

@Esailija:真正解决这个问题。我对验证正则表达式'parseJSON'在内部使用感到困惑。 – jAndy 2012-02-02 11:13:27

如果指定dataTypejson 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