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 文字列は本当に無効ですか?