4

在尝试解析从服务器返回的 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

我注意到当标头 Content-type 未设置为“application/json”时 JSON.parse 工作正常,但如果 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"}
4

3 回答 3

10

当您不指定调用dataType选项时$.ajax,jQuery 会尝试根据响应中Content-Type返回的标头解析响应。

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

当您没有为, 和标头指定dataType“json”时,将被解析为 JSON(Javascript 对象文字)。Content-Typeresponse

当您指定dataType为“json”时,无论Content-Type标头是什么,都将response被解析为 JSON(Javascript 对象文字)。

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

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

于 2013-04-11T04:30:05.060 回答
0

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

dataType:"json"

在你的 ajax 中。否则它不会工作。我猜它的问题。如果它也没有显示你的 ajax。

于 2013-04-11T04:24:01.643 回答
0

@Ian 答案是完整的,但乍一看对我来说有点晦涩难懂。
简单来说:如果你在 request( dataType: "JSON") 和 response( 'Content-type','application/json') 中都指定了 JSON,那么 response 已经是一个 JSON 对象,不需要解析它。

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

于 2018-01-12T16:48:27.117 回答