注:これが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は5で"USA"
表示されるため、ASCII以外の文字は1つもないと確信しています。ただし、Firefoxはコンテンツの長さが4で表示されます。Content Length
null
- を実行する
wget
と、すべてのJSONで正しいコンテンツが得られます。私はブラウザよりもwgetを信頼しているので、Drupal/.htaccessの問題ではないと思います。 - JSONはjsonlint.comによると整形式であり、PHP関数が変換を行うため、非常に整形式であると思います。
- 権限(誰でもページにアクセスできます)やエンコード(UTF-8の送信)などの他のものは結果を変更しません。
- ブラウザでURLを呼び出し、JSON応答を確認したいので、これはjQuery/クロスドメイン関連ではありません。
- 同じ(Drupal)セットアップの別のマシンでは、結果は同じです。
- Drupalのセットアップに関係のない他のディレクトリからJSONを返すことができます。しかし、私はただ行うので
json_encode
、Drupalによるすべての可能な出力をバイパスし、wget
動作するので、DrupalIMOとは関係ありません。
コメントによる更新
- コンテンツタイプには
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"
。