1

次のような PHP 5 コードがあります。

$result = myFunction(...);  // return false, or doit action
$reply = array();
if ($result) {
   $reply['doit'] =  $result;
   $reply['status'] = "a status html string";
} else {
   $reply['content'] = "Some html text";
   $reply['menu'] = "Some other html text";
   $reply['status'] = "a different status html string";
}
return $reply;

呼び出し元にはフラグメントが含まれています

$reply = somefunction();
echo json_encode($reply);

この応答はクライアントに送信され、そこで jquery はそれを関数に渡します

function handleReply(reply) {
    if (reply.doit) {
        handle action
    }
    if (reply.content) document.getElementById('content').innerHTML=reply.content;
    if (reply.menu) document.getElementById('menu').innerHTML=reply.menu;
    if (reply.status) document.getElementById('status').innerHTML=reply.status;
}

私が苦労しているのは、if ステートメントの doit ブランチが実行されると ($result は文字列です)、jquery によって返される応答が文字列になることです。コンテンツ/メニュー/ステータス側が取得される場合 ($result が false)、返信はオブジェクトです。

配列に 2 番目のインデックスを追加しましたが、結果は同じです。すべての文字列は ASCII ですが、UTF8_encode で渡そうとしました。jquery で何らかの動作をトリガーしていた場合に備えて、「doit」インデックスの名前を「action」から変更しました。

念のために言っておきますが、間違っている場合の返答は(例えば)です。

"{"doit":"obj=session&act=show&ID=3","status":"<p>Nic: Ian<br\/>Reseller: Coachmaster.co.uk<br\/>Status: SysAdmin <\/p>"}"

これは文字列です。私は期待しました:

{"doit":"obj=session&act=show&ID=3","status":"<p>Nic: Ian<br\/>Reseller: Coachmaster.co.uk<br\/>Status: SysAdmin <\/p>"}

これはオブジェクト/配列です。これは、私のロギングがエコーされていることも示しています。

Windows 7 と Apache で php5.4.3 を使用し、Linux と nginx で php 5.3.10 を使用していますが、結果は同じです。jquery はどちらもバージョン v1.7.2 です。jQuery UI - v1.10.3 - 2013-07-02 もロードされます。

jquery のバグであれば、非常に奇妙なバグです。どうすれば証明できますか?

4

4 に答える 4

4

jQueryの自動検出に依存していると思います。試す:

header('Content-Type: application/json');
于 2013-07-30T14:18:25.263 に答える
0

$.getJSON()jqueryメソッドを使用していますか$.ajax()?

メソッドを使用$.ajax()する場合、ajax リクエストを作成するときにオプションを指定しないdataType: "json"と、jQuery は "インテリジェントな推測" (応答の MIME タイプを検索することによる) を使用して、サーバーの応答 (xml、html、プレーン、json オブジェクト. ..)。自動的にそれを把握できない場合は、応答がプレーン テキストであると想定され、通常の文字列が成功ハンドルに返されます。

次のいずれかを使用するか$.getJSON()、指定する必要がありますdataType: "json"

$.ajax({
    url: "....",
    dataType: "json",
    success: function(reply) { // success handle
        // if not specifying dataType: "json",
        // and if not using response headers to specify MIME type "application/json", 
        // reply will not be object but a string!
    }
});

または、Marek が回答に投稿したように、応答ヘッダーで MIME タイプを指定します。

于 2013-07-30T14:43:21.867 に答える
0

多分あなたは試すことができます:

jQuery.parseJSON()

于 2013-07-30T14:14:25.373 に答える
0

文字列を JavaScript に取得したら、eval()それを JSON オブジェクトに変換する必要があります。

var reply_json = eval( reply );

reply_json.contentその後、 、 などにアクセスできますreply_json.menu

明らかに、評価しているものに注意し、信頼できるソースからのものであることを確認してください。

于 2013-07-30T14:11:56.927 に答える