2013-02-14 70 views
0

这是比其他任何事情更多的过程问题。我很好奇为什么会发生这种情况,我似乎无法在ECMA脚本文档中找到有关此“功能”的任何文档。Javascript自动分析嵌套对象

当我做内jQuery的到我的服务器AJAX调用,它将返回以下JSON响应页面:

{"version":"v1","status":"OK","timestamp":"2013-02-14 10:32:45","data":"true","error":""} 

有了这个字符串我有打电话给jQuery.parseJSON(串);把它当作一个对象,并且能够把它作为一个对象来引用。

然而,当我的服务器返回是这样的:

{"version":"v1","status":"OK","timestamp":"2013-02-14 10:12:19","data":{"a":"asgsadfga","b":false,"c":[]},"error":""} 

的Javascript自动加载此一个,而不需要解析的对象。看起来,因为这个例子返回一个嵌套的对象,尽管事实上它是从服务器返回的一个字符串,但Javascript会立即识别并解析字符串。

这是预期的功能,如果有的话,任何人都可以指向我的文档吗?

编辑:

这里是有问题的AJAX调用:

jQuery.ajax({ 
     url: url, 
     type: 'GET', 
     async: false, 
     success: function (result) { 
      console.log(result) 
     } 
+0

显示您的代码,正在使AJAX调用,你说有事情发生,但没有表现出什么样的代码导致它 – 2013-02-14 17:51:47

+0

我是问不关我的代码的问题,但更多的,为什么第一个字符串是只被jQuery解释为一个字符串,但第二个被解释为一个对象。对于我如何在前端和后端解决这个问题给出了各种答案。但我真正想知道的是,如果有什么智能猜测数据的内容类型是什么。 – Xenology 2013-02-14 18:40:18

+0

你在这两种情况下对它的调用方式不同,对吗?不要隐藏你的代码,不要假设你知道发生了什么事情! – 2013-02-14 18:46:49

回答

1

根据AJAX()中的jQuery API文档下的dataType

的数据类型(缺省:智能猜测(XML,JSON,脚本或 HTML))类型:字符串的类型的数据您期待从服务器返回 。 如果没有指定,jQuery将尝试根据响应的MIME类型 来推断它(XML MIME类型将产生XML,在 中1.4 JSON将产生一个JavaScript对象,在1.4脚本中将执行该脚本,并且其他任何东西都会以字符串形式返回)。

希望这会有所帮助。

+0

我很困惑,没有发送任何作为dataType的数据到服务器,为什么有些调用作为对象返回,而另一些作为字符串返回。默认情况下我的服务器以字符串形式返回所有内容我更想知道为什么有些对象会被解释为字符串,其他的则是对象。这是我所问的问题,这是我正在寻找的答案。 – Xenology 2013-02-14 18:38:02

2

确保你的服务器设置适当的Content-Type响应HTTP标头:

Content-Type: application/json 

让jQuery将自动将服务器返回的JSON字符串解析为一个javascript对象,该对象将作为参数传递给您的成功回调。

或者,如果由于某种原因,你有,你有没有控制一些破碎的服务器端脚本比你可以设置dataType参数强制jQuery来解析JSON作为结果:

$.ajax({ 
    url: '/script.cgi', 
    type: 'POST' 
    dataType: 'json', 
    success: function(result) { 
     // result will be a javascript object 
    } 
}); 

但显然正确的做法是修复您的服务器端脚本以返回适当的Content-Type响应头。

+0

OP不知道为什么它没有调用'jQuery.parseJSON(string)'就已经解析了? – 2013-02-14 17:52:29

+1

不,这是他第一次说他需要明确解析对象。但正如我在我的回答中所解释的,这与服务器返回的JSON字符串无关(假设它当然是一个有效的JSON字符串),但与服务器发送的“Content-Type”响应HTTP标头无关。也正如我在答复中解释,如果服务器不设置这个头正确(这是我认为在第一种情况下发生的事情)有可能迫使它使AJAX时使用'dataType'参数在客户端上呼叫。 – 2013-02-14 17:53:02

+1

其实我是在问为什么第一个刺没有解析,而第二个是。 AJAX调用在两个实例中都是相同的,问题是jQuery能够确定一个是对象,而不是另一个。我想知道这是怎么发生的。 – Xenology 2013-02-14 18:53:31

0

您应该在$.ajax呼叫中指定dataTypejson。 dataType是您期望从服务器接收的MIME。 contentType是服务器对你的期望。

+1

不,如果您有一个正确设置了“Content-Type”响应HTTP标头的正确书写的服务器端脚本,则不需要指定此脚本。 – 2013-02-14 17:54:55

+0

再次阅读规格,你是对的。如果服务器指定了Content-Type,那么jQuery将推断正确的数据类型。然而,鉴于OP有时会得到json对象,有时候不会,我猜他的服务器没有指定内容类型。所以Ajax中的dataType应该有所帮助。 – NoodleFolk 2013-02-14 17:58:00