[jquery] jQuery는 AJAX 쿼리에서 내 JSON을 구문 분석하지 않습니다.

jQuery.ajax ()를 사용하여 서버에서 반환 된 일부 JSON 데이터를 구문 분석하는 데 어려움이 있습니다.

AJAX를 수행하려면 다음을 사용합니다.

$.ajax({
  url: myUrl,
  cache: false,
  dataType: "json",
  success: function(data){
    ...
  },
  error: function(e, xhr){
    ...
  }
});

그리고 항목 배열을 반환하면 제대로 작동합니다.

[ { title: "One", key: "1" }, { title: "Two", key: "2" } ]

성공 함수가 호출되고 올바른 개체를받습니다.

그러나 단일 객체를 반환하려고 할 때 :

{ title: "One", key: "1" }

오류 함수가 호출되고 xhr에 ‘parsererror’가 포함됩니다. JSON을 전송하기 전에 서버에서 괄호로 묶어 보았지만 아무런 차이가 없습니다. 그러나 내용을 Javascript의 문자열에 붙여 넣은 다음 eval () 함수를 사용하면 완벽하게 평가됩니다.

내가 뭘 잘못하고 있는지 아이디어가 있습니까?

안토니



답변

서버가 데이터를 Content-Type으로 보내고 "*/json"있습니까? 그렇지 않은 경우 응답 헤더를 적절히 수정하십시오. "application/json"예를 들어 전송 은 괜찮습니다.


답변

json.org 사양 에 따르면 반품이 유효하지 않습니다. 이름은 항상 따옴표로 묶여 있으므로 반환해야합니다.

{ "title": "One", "key": "1" }

[ { "title": "One", "key": "1" }, { "title": "Two", "key": "2" } ]

이 중 하나가 지금 작동한다고 말했기 때문에 설정 문제가 아닐 수 있지만 나중에 다른 JSON 파서로 전환해야하는 경우를 대비하여 수정해야합니다.


답변

JSON 문자열은 따옴표로 묶여 있습니다. 작은 따옴표는 유효한 대체물이 아닙니다.

{"who": "Hello World"}

유효하지만 이것은 아닙니다 …

{'who': 'Hello World'}

OP의 문제는 아니지만 여기에 착륙하는 다른 사람들에게는 주목할 가치가 있다고 생각했습니다.


답변

이 문제는 일반적으로 요청이 잘못된 MIME 유형을 수신했기 때문에 발생합니다. 자신의 컴퓨터에서 개발할 때 자신의 컴퓨터 인 “서버”에서 적절한 MIME 유형을받지 못하는 경우가 있습니다. 브라우저에서 로컬로 저장된 파일을 열어 개발할 때이 문제가 한 번 발생했습니다 (예 : URL은 “c : /project/test.html”).

beforeSend 속성을 사용하여 MIME 유형을 재정의하는 콜백 함수를 추가해보십시오. 이것은 잘못된 MIME 유형이 서버에서 전송되고 호출 코드에서 수신 되었음에도 불구하고 코드가 json을 처리하도록 속일 것입니다. 다음은 몇 가지 예제 코드입니다.

이 질문 에 따르면 적절한 MIME 유형은 application / json 이지만 시도했을 때 application / j-son이 작동했다는 것을 알고 있습니다 (현재 몇 년 전). 아마도 application / json을 먼저 시도해야합니다.

var jsonMimeType = "application/json;charset=UTF-8";
$.ajax({
 type: "GET",
 url: myURL,
 beforeSend: function(x) {
  if(x && x.overrideMimeType) {
   x.overrideMimeType(jsonMimeType);
  }
 },
 dataType: "json",
 success: function(data){
  // do stuff...
 }
});


답변

나는이 문제가 있었고 조금 사용했습니다.

eval('('+data+')')

객체에서 반환 된 데이터를 가져옵니다. 그러나 나중에 괄호 안에 ‘누락)’오류가 발생하는 다른 문제가 발생했으며 jQuery에 json 구조에 대한 문자열을 평가하기위한 함수가 있음을 발견했습니다.

$.parseJSON(data)

트릭을해야합니다. 이것은 물론 적절한 형식의 json 문자열을 갖는 것 외에도 ..


답변

json 응답을 에코하고 헤더가 * / json과 일치하지 않으면 내장 된 jQuery.parseJSON API를 사용하여 응답을 구문 분석 할 수 있습니다.

response = '{"name":"John"}';
var obj = jQuery.parseJSON(response);
alert( obj.name === "John" );


답변

{ title: "One", key: "1" }

당신이 생각하는 것이 아닙니다. 표현식 으로서는 객체 리터럴이지만 명령문으로는 다음과 같습니다.

{                // new block
    title:       // define a label called 'title' for goto statements
        "One",   // statement: the start of an expression which will be ignored
        key:     // ...er, what? you can't have a goto label in the middle of an expression
                 // ERROR

안타깝게도 eval ()은 명령문인지 표현식인지 지정하는 방법을 제공하지 않으며 잘못 추측하는 경향이 있습니다.

일반적인 해결책은 실제로 eval () 함수로 보내기 전에 괄호 로 묶는 입니다. 서버에서 시도해 봤다고 하셨는데 … 분명히 통과가 안되네요. XMLHttpRequest 응답을받는 것이 무엇이든 클라이언트 측에서 말할 수 있어야합니다.

eval('('+responseText+')');

대신에:

eval(responseText);

응답이 실제로 진술이 아닌 표현이면됩니다. (예 : 세미콜론 또는 줄 바꿈으로 구분 된 여러 절이 없습니다.)