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は5"USA"表示されるため、ASCII以外の文字は1つもないと確信しています。ただし、Firefoxはコンテンツの長さが4で表示されます。Content Lengthnull
  • を実行する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関数と同様に両方を使用します。
  • nullFirebugで調べたので、応答は正しいと確信しています。
  • 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がどういうわけかサーバーに正しい言語を送信していなかったことでした。クッキー経由かヘッダー内かわかりません。出力に言語対応フィルタリングを使用したため、出力が返されることはありませんでした。

したがって、言語フィルターを無効にすると問題が解決しました。Firefoxで言語に問題が発生した理由はわかりませんが、これで問題は解決しました。

于 2012-09-03T13:01:25.727 に答える
0

コメントで述べたように、json応答をブラウザに返送する方法に問題がある可能性があります

エンコーディングの問題ではありません。$ someArray [0] ["some_key"]から単一の要素のみを返す場合、Chromeはコンテンツの長さが5の "USA"を表示するため、ASCII以外の文字は1つもないと確信しています。ただし、Firefoxはコンテンツの長さが4のnullを表示します。

nullは、コンテンツの長さ4を返します

USAはコンテンツの長さ5を返しますか?なんで?アメリカには3文字しかありません

応答の前後に白い間隔を確認します

于 2012-09-03T12:31:30.723 に答える
0

XMLHttpRequestで使用するためにjsonファイルをヘッダーに送信する

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

を使用して

header("header_name: $json_string"));

FFで失敗し、

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

すべてのために失敗します

phpヒアドキュメントソリューション

$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 に答える