Firefox / Opera中的JSON输出为null,在Chrome中是正确的

时间:2012-09-03 11:40:53

标签: php json response

注意:我不认为这是Drupal问题,所以我在这里发布它。

我们创建了一个应该返回JSON的Drupal模块。例如。调用/ foo / json返回JSON。这在Chrome中都很好。但是,Firefox只显示“null”。

JSON的内容只是一个PHP数组,其中包含一些用循环填充的信息

$someArray = array();
foreach(....) {
   $someArray[] = array("foo" => "bar", ...);
}

echo json_encode($someArray);

到目前为止,我知道

  • 这不是编码问题。如果我只返回$someArray[0]["some_key"]中的单个元素,Chrome会显示"USA" 5 Content Length,所以我确信没有一个非元素ASCII字符。但是,Firefox会显示null,其内容长度为 4
  • 做一个wget给了我所有JSON的正确内容。由于我比浏览器更信任wget,我认为它不是Drupal / .htaccess问题。
  • 根据jsonlint.com,JSON格式正确,由于PHP函数进行转换,我认为它的格式非常好。
  • 其他内容如权限(允许每个人访问该页面)或编码(发送UTF-8)不会改变结果。
  • 这不是jQuery /跨域相关的,因为我只想在浏览器中调用URL并希望看到JSON响应。
  • 在具有相同(Drupal)设置的另一台机器上,结果是相同的。
  • 我能够从与Drupal设置无关的其他目录返回JSON。但是因为我只做json_encode,所以我绕过了Drupal的每一个可能的输出,因为wget起作用,我与Drupal IMO无关。

根据评论进行更新

  • 内容类型为application/json,其中包含正确的编码信息。将其更改为text / html或其他内容不会改变任何内容。同时使用header和Drupal函数来设置标题。
  • 我确信null回复是正确的,因为我用Firebug进行了检查。
  • ini_set('default_charset', 'UTF-8');不会更改任何内容,因为我已经在标题中提交了此信息。

Firefox与Firebug的响应标头

Cache-Control   no-cache, must-revalidate, post-check=0, pre-check=0
Connection          Keep-Alive
Content-Language    en
Content-Length  4
Content-Type    application/json; charset=utf-8
Date            Mon, 03 Sep 2012 12:16:58 GMT
Etag            "1346674618"
Expires         Sun, 19 Nov 1978 05:00:00 GMT
Keep-Alive          timeout=5, max=100
Last-Modified   Mon, 03 Sep 2012 12:16:58 +0000
Server          Apache/2.2.22 (Ubuntu)
X-Powered-By    PHP/5.3.10-1ubuntu3.2

请求标题

Accept          text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.7,de;q=0.3
Connection          keep-alive
Cookie          has_js=1; respimg_ratio=1; respimg=1000 //Drupal information
Host            vie.local
User-Agent          Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0

TL; DR
虽然Chrome显示正确(格式正确)的JSON输出,但Firefox(在Opera中也经过测试)只显示null,即使是最简单的字符串"USA"也是如此。

3 个答案:

答案 0 :(得分:1)

问题是Firefox不知何故没有向服务器发送正确的语言。我不知道是通过cookie还是在标题内。由于我对输出使用了语言感知过滤,因此从未返回输出。

因此,禁用语言过滤器可以解决问题。我不知道为什么Firefox有这种语言的问题,但这解决了这个问题。

答案 1 :(得分:0)

正如我在评论中所说,可能存在如何将json响应发送回浏览器的问题

  

这不是编码问题。如果我只返回$ someArray [0] [“some_key”]中的单个元素,Chrome会显示内容长度为5的“USA”,所以我确信没有一个非ASCII字符。但是,Firefox显示null,内容长度为4.

null返回内容长度为4

美国的内容长度为5?为什么?美国只有3个字符

检查响应之前或之后的白色间距

答案 2 :(得分:0)

将json文件发送到XMLHttpRequest的标头中

$json_string = file_get_contents("path/well_formated.json"); 

使用

header("header_name: $json_string"));

无法使用FF和

header("header_name:". json_encode($json_string));

全部失败

php HEREDOC解决方案

$json_string = file_get_contents("path/well_formated.json");
$h= <<<H
header_name : $json
H;
header($h);

这适用于Chrome,Opera,Firefox,IE