2013-10-21 2 views
0

JQuery $ .ajax를 사용하여 처리 한 서버에 JSON 인코딩 된 데이터를 보낸 다음 JSON 인코딩 결과를 다시 보내는 응용 프로그램이 있습니다. 문제는 응답을 처리 할 때 JQuery에서 구문 분석 오류가 발생한다는 것입니다. (PHP의 json_encode 함수가 잘못된 JSON 형식을 출력하는 것처럼). 여기서 코드를 제공 :JQuery는 PHP의 json_encode를 사용할 때 JSON 구문 오류를 발생시킵니다.

JavaScript 코드 :이 반응 출력 PHP 코드의 조각

$.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); 
    } 
}); 

:

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

$ uFilters 간단한 배열을하며 은 $ 응답 객체의 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 

때마다 나는 내가 '테이블의 내용을 업데이트 할 수 없습니다'얻을 코드를 실행하고, 자바 스크립트 콘솔에서 내가 가진 :

'SyntaxError: JSON.parse: unexpected character'

내가 데이터 유형을 정의에도 불구하고 'JSON'과 출력으로 PHP에 의해 json_encode'd된다. 자바 스크립트 콘솔에서 나는 응답 텍스트는 것을 볼 수 있습니다

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

시도 사본이 온라인 JSON 유효성 검사기 도구를 확인, 흥미로운 일이없이 (이 몇 번 유효하고 몇 번 유효하다 모든 일관성) 조금 혼란스러워.

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

또는 전혀 헤더,하지만 아무것도 : 처럼 다른 헤더를 사용하려고 노력했다.

출력 내용이 JSON 형식이며 메시지에 JSON 내용이 있다고 표시 되더라도 JQuery ajax 요청의 dataType을 'text'로 편집하면 성공 처리기가 실행되고 응답이 올바르게 처리됩니다. 이 경우 $ .parseJSON (응답)을 시도 할 때 같은 문제가 발생합니다.

무엇이 잘못 되었나요? 내 JSON 문자열이 실제로 유효하지 않습니까?

+0

json-content가 시작되기 전에 공간이있을 수 있습니까? – OptimusCrime

+0

@OptimusCrime, 그렇습니다. 실제로는 BOM 문자 였지만 말입니다. – ACs

답변

2

응답을 디버그하여 유효하지 않은 문자를 확인하십시오. dataType을 text로 설정하고 리턴 된 텍스트를 이스케이프하십시오.

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

반환되는 문자를 볼 수 있습니다. 문제를 일으키는 이상한 반환 문자가있을 수 있습니다.

+0

조언을 주셔서 감사합니다. 응답은 % uFEFF (BOM) 문자로 시작되었으며 짧은 조사 후에 BOM으로 저장 한 파일을 찾았습니다. – ACs

관련 문제