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