4

注意:我不认为这是 Drupal 问题,所以我将其发布在 SO 上。

我们创建了一个应该返回 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,所以我确信没有一个非 ASCII 字符。但是,Firefox 显示的内容长度为4Content Lengthnull
  • 做 awget给我所有 JSON 的正确内容。由于我比浏览器更信任 wget,因此我认为这不是 Drupal/.htaccess 问题。
  • 根据 jsonlint.com,JSON 格式正确,并且由于 PHP 函数进行转换,我认为它的格式确实正确。
  • 权限(每个人都可以访问页面)或编码(发送 UTF-8)等其他内容不会改变结果。
  • 这与 jQuery/跨域无关,因为我只想在浏览器中调用 URL 并希望查看 JSON 响应。
  • 在另一台具有相同(Drupal)设置的机器上,结果是相同的。
  • 我能够从与 Drupal 设置无关的其他目录返回 JSON。但是因为我只是做 a json_encode,所以我绕过了 Drupal 的所有可能输出,并且由于wget我的工作,它与 Drupal IMO 无关。

根据评论更新

  • 内容类型application/json具有适当的编码信息。将其更改为 text/html 或其他内容不会改变任何内容。使用这两者header以及 Drupal 函数来设置标题。
  • 我确信null响应是正确的,因为我使用 Firebug 对其进行了检查。
  • ini_set('default_charset', 'UTF-8');不会改变任何东西,因为我已经在标题中提交了此信息。

来自带有 Firebug 的 Firefox 的响应标头

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".

4

3 回答 3

1

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

所以禁用语言过滤器解决了这个问题。我不知道为什么 Firefox 会出现语言问题,但这解决了问题。

于 2012-09-03T13:01:25.727 回答
0

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

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

null 返回内容长度为 4

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

在响应之前或之后检查空白间距

于 2012-09-03T12:31:30.723 回答
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

于 2015-10-30T14:18:27.287 回答