当content-type设置为application / json时,JSON.parse()不起作用

时间:2013-04-11 04:14:55

标签: jquery ajax json content-type

我在尝试解析从服务器返回的JSON字符串时遇到了jquery(错误/错误):

Timestamp: 10/04/2013 21:05:12
Error: SyntaxError: JSON.parse: unexpected character
Source File: http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
Line: 3

我发现JSON.parse在标题Content-type未设置为'application / json'时工作正常,但如果Content-type设置为json则不起作用。知道为什么会这样吗?

不工作代码:

控制器代码:

  $response = array('data' => array('msg' => 'Form did not validate'), 'response_handler_fn' => 'sign_up_response_handler_fn');
  $this->getResponse()->setHttpHeader('Content-type','application/json');
  return $this->renderText(json_encode($response));

Javascript:

// ...
success: function( response ) {
var responseData = $.parseJSON(response);
}

接头

Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection  Keep-Alive
Content-Length  92
Content-Type    application/json
Date    Wed, 10 Apr 2013 20:05:12 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive  timeout=15, max=100
Pragma  no-cache
Server  Apache
X-Powered-By    PHP/5.3.5

回复:

{"data":{"msg":"Form did not validate"},"response_handler_fn":"sign_up_response_handler_fn"}

有效的代码

控制器:

  $response = array('data' => array('msg' => 'Form did not validate'), 'response_handler_fn' => 'sign_up_response_handler_fn');
  return $this->renderText(json_encode($response));

Javascript与工作相同

标题:

Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection  Keep-Alive
Content-Length  92
Content-Type    text/html; charset=utf-8
Date    Wed, 10 Apr 2013 20:09:04 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive  timeout=15, max=100
Pragma  no-cache
Server  Apache
X-Powered-By    PHP/5.3.5

回应:

{"data":{"msg":"Form did not validate"},"response_handler_fn":"sign_up_response_handler_fn"}

3 个答案:

答案 0 :(得分:10)

如果没有为dataType调用指定$.ajax选项,jQuery会尝试根据响应中返回的Content-Type标头解析响应。

因此,当您为dataType指定任何内容时,Content-Type标题没有任何特殊内容时,response将被解析为文本。

如果dataType没有指定任何内容,Content-Type标题为“json”,response将被解析为JSON(Javascript对象字面值)。

当您将dataType指定为“json”时,Content-Type标头无关紧要,response被解析为JSON(Javascript对象字面值)。

尝试将对象文字传递给JSON.parse将失败,因为它只接受字符串。

因此,您需要确定自己要设置的内容以及要调用的内容(JSON.parse),并使用正确的组合。

答案 1 :(得分:0)

如果Content-type设置为json并将响应作为json传递,则需要设置

dataType:"json"

在你的ajax.Otherwise它将无法正常工作。我猜它的问题。如果它没有显示你的ajax。

答案 2 :(得分:0)

@Ian答案已经完成,但乍一看对我来说有点模糊。
 只是为了简化:如果您在请求(dataType: "JSON")和响应('Content-type','application/json')中都指定了JSON,则响应已经是JSON对象,无需解析它。

  而不是var responseData = $.parseJSON(response);  
, 只是:
var responseData = response