2012-09-03 40 views
4

注意:我不考慮這是Drupal問題,所以我將它張貼在SO上。Firefox/Opera中的JSON輸出爲null,在Chrome中正確

我們創建了一個應該返回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",Content Length,,所以我確信沒有單個非ASCII字符。但是,Firefox顯示內容長度爲的null
  • 做一個wget給我所有的JSON正確的內容。因爲我比wget更信任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功能來設置標題。

  • 我確信repsonse是正確的,因爲我用Firebug進行了檢查。
  • ini_set('default_charset', 'UTF-8');不會更改任何內容,因爲我已經在標題內提交了此信息。從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
雖然鉻示出了正確的(合式)JSON輸出,火狐(和也在Opera中測試)僅顯示null,即使是最簡單的字符串,如"USA"

+0

嘗試設置響應報頭類型的應用程序/ JSON –

+0

什麼'內容type'頭你在設置PHP的輸出? –

+1

而你並沒有這麼說,但你是否真的檢查過Firebug或Firefox網絡控制檯中的HTTP響應? –

回答

1

的問題是,火狐,不知何故,沒有發出正確的語言到服務器後,白色的間距。我不知道是通過cookie還是通過標題。由於我對輸出使用了語言意識過濾,輸出從未返回。

因此禁用語言過濾器解決了問題。我不知道爲什麼Firefox在語言方面存在問題,但是這解決了問題。

0

正如我在我的評論說,有可能是你如何發回JSON響應到瀏覽器

它不是一個編碼問題的問題。如果我只從$ someArray [0] [「some_key」]返回單個元素,Chrome將顯示內容長度爲5的「USA」,因此我確信沒有單個非ASCII字符。不過,Firefox顯示空與4

無效的內容長度返回4

USA內容長度返回5內容長度?爲什麼?美國只有3個字符

檢查之前或響應

+0

這不僅僅是「美國」,它的「美國」,請注意引號。 – DrColossos

+0

@DrColossos啊。我明白...我的錯誤 –

0

發送JSON文件分離成一個標題使用

header("header_name: $json_string")); 

失敗對於FF和

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

的XMLHttpRequest使用

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

失敗所有

PHP HEREDOC解決方案

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

這將在鉻,歌劇,火狐做工精良,IE