0

JQuery $.ajax を使用して JSON エンコードされたデータをサーバーに送信し、そこで処理してから結果を JSON エンコードして送り返すアプリケーションがあります。問題は、応答を処理したいときに JQuery が解析エラーを出すことです。(あたかも PHP の json_encode 関数が無効な JSON 形式を出力するかのように)。コードは次のとおりです。

Javascript コード:

$.ajax({
     type: 'POST',
     url: URL+'pages/processListUIAjaxRequest',
     data:{filters: filters, rebuild_params: $('#rebuild_params\\['+unique+'\\]').val()},
     dataType: 'json',
     success: function(response){
          alert(response);
     },
     error: function(request, status, error){
          alert('Unable to update table contents');
          console.log(request);
          console.log(status);
          console.log(error);
     }
});

これは、レスポンスを出力する PHP コードの一部です。

$response->addResult($uFilters);
header('Content-Type: application/json');
$response->toJSON(true);

$uFilters は単純な配列で、$response オブジェクトの toJSON メソッドは次のとおりです。

public function toJSON($output = false){
        $out = array();

        if($this->hasErrors()){
            $out['has_error'] = true;
            $out['errors'] = $this->getErrors();
        } else $out['has_error'] = false;
        $out['result'] = $this->_result;

        if($output){
            echo json_encode($out);
        }else{
            return json_encode($out);
        }
    }// toJSON

コードを実行するたびに、「テーブルの内容を更新できません」というメッセージが表示され、JavaScript コンソールでは次のようになります。

「SyntaxError: JSON.parse: 予期しない文字です」

dataType: を 'json' として定義したにもかかわらず、出力は PHP によって json_encode されます。JavaScript コンソールで、応答テキストが次のようになっていることがわかります。

"{"has_error":false,"result":{"page_id":"xxx"}}" 

これをコピーして、オンラインの JSON 検証ツールで検証しようとしましたが、興味深いことに、数回有効で、数回無効でした (一貫性がありません)。少し混乱しています。次のような他のヘッダーを使用しようとしました:

header('Content-Type: text/json'); 
header('Content-Type:javascript/json');
header('Content-Type: application/json');

またはヘッダーなしで、何もありません。

JQuery ajax リクエストの dataType を 'text' に編集すると (出力が JSON 形式であり、ヘッダーにも JSON コンテンツであると表示されているにもかかわらず)、成功ハンドラーが実行され、正しく応答が得られます。この場合、$.parseJSON(response) を実行しようとすると同じ問題が発生します。

何が悪かったのか?私の JSON 文字列は本当に無効ですか?

4

1 に答える 1

2

応答をデバッグして、応答を無効にしている文字を確認します。dataType を text に設定し、返されるテキストをエスケープします。

dataType: 'text',
success: function(response){
    console.log(escape(response));
},

返された文字が表示されます。問題を引き起こしている奇妙な戻り文字がある可能性があります。

于 2013-10-21T12:24:18.890 に答える