2010-07-29 6 views
0

자신이 소유하지 않은 도메인에서 데이터를 가져 오기 위해 jQuery.getJSON을 사용하려고합니다. 나는 과거에 작동하게 만들었지 만 이번에는 실패를 계속합니다. 브라우저에 응답을 얻었지만 크롬은 SyntaxError: Unexpected token :이라고 말하고 Firefox는 invalid label이라고 말합니다.

여기에는 몇 가지 특성이 있습니다. 코드가 MY_JSON_RESPONSE (변수가 아니라 "별칭")라고 가정합니다. 이 모두 반환 예상되는 개체 :이 요청입니다

a = MY_JSON_RESPONSE; 
eval(MY_JSON_RESPONSE); 

를 걸 :

$.getJSON("http://xxx.yyy.zzz/abc?callback=?", 
    function(data) { 
    console.log(data); 
    }); 

편집 :

{"aaaaaaa":"aaaaaaaa aaaaa aaa aaaaaaaaaa","aaaaa":"aaaaaaaa aaaaa aaa","aa":"0000000","aaaa_aaaaaaa":"aaa aaaaa","aaaaaaa_aaaaaaa":"aa aaa aaaaaaaa aa aaaaaaaa aaa aaaaaaa aaaaaa aaa aaa aaaaaaaa aa aaaaaaaa aa aaaaaa aaaaa aaa aaaaa. aaa aaaaaaaa aaaaa aaa aaaaaaaaaa aaaaaaaa aaaaa aaaaa aaaaaaaa aaaaaaaaaaa aaaaaaaaaa aa aaaa 00 aaaaaaa aaaaaaaaa aa aaa aaaaaaaa aaaaa aaa, aa aaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaa, aaaaaaaaa aaa aaaaaaa aaaaaaaa. 00% aa aaaaaaa aaaaaa aaaaa aaaaa aaaaaaaaaaaaa aaaaa aaaaaaaaaaaaa.","aaaaaaaaa":[{"aaaaaa":"aaaaa aaa aaaaaa aaaaaaaa","aaaaaaa":"aaaaaaaa aa aaaaaa aaa aaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaa","aaaaaaa":"aaaaaaaa aaaa aa &aaaa;aaaaa aaa aaaaaaaaaa aaaaaaaaa&aaaa; - aaa aaa aa, aaaaa aaa a aaaa aaaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a000.00"},{"aaaaaa":"aaaaa","aaaaaaa":"aaaa aaaa aaaa!!!!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaa\/aaa","aaaaaaa":"aaaaaaa aaaaa aaaa aaa aaaa aaaaa aaa aaaaa aaa aaaaaaa aaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aa (aaaaaaa &aaa; aaaaaaaaa)","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a0000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaaaaa aaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaa","aaaaaaa":"aaaa aaaaaaa aaaaaaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaaaaa","aaaaaaa":"aaaaa aaaaaa�a aaa, aaa! aaaa aaaaaaaa aa aaa aaa! :-) --aaa","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaa - aaaaaaaa aaaaaa aaa","aaaaaaa":"aaaaaa aa aaa aaa aaaaaaaa aaaaa aaaaaa aa aaaa aa aaa aaaaa aaa aaaaa. aaaa aaaa aaaaaa aaaaaaaaa !!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaa aaaaaaaaa","aaaaaaa":"aa aaaaaa aaaa aaaaaaaa aa aaaa aa aaaa aa a aaaa aaaaa aaa aaaaaaaaaa. aaaa aa aa aaaaaa aa a aaaa aaaaa.","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaaaa aaa aaaaaaaaaaa aaaaaaa aaaaaa","aaaaaaa":"aaaaa aaaaa. aaaa aa aaa aaaaaa aaaaaaaaa!!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaaaaaaaa aaaaaa","aaaaaaa":"aaaaaaa aaa aaaa aaaaaa�a aaaaaaaaa aaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a0000.00","aaaa_aaa":"\u00a000.00"},{"aaaaaa":"aaaaaaa aaaaaa","aaaaaaa":"aaaaaaaaa aaaaa, aaa! aaaaaaa &aaa; aaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaaaa aaaaaaaa","aaaaaaa":"aaaaaaaa aaaaaaa - aaaaaaa aaaaaaaaa a aaa aaa aaaaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaa","aaaaaaa":"aaaaaaaaaaaa - aaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a0000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaaaaaaa","aaaaaaa":"aaaa aaaa!!!","aaaa":"00\/00\/00","aaaaaa":"\u00a00.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaaa","aaaaaaa":"aaaa aaaa aaaaa, aaaaaaa, aaaaaaa, aaaaa, aaa, aaaa, aaa, aaaaaaaa, aaaa, aaa, aaaaa, aaa, aaa, aaaaa, aaa, aaaa, aaaa, aaaa, aaaaa, aaa, aaaaaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaaa aaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaa","aaaaaaa":"aaaa aaa aa aa aaaa aa a aaaaaaa aa aaaaa! aaa aaa aaaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaa","aaaaaaa":"aa aa aa! :)","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaaa","aaaaaaa":"aaaa a aaaaaa aaaaaaaaa aaaa aa aa aaa :)","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaa-aaaaaaa aaaaaaaa","aaaaaaa":"aaaa aaaaaaaa aa aa aaa aaaa aa aa aaaaaaaaaaa, aaaa a. aaaaaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaa","aaaaaaa":"a aaaaaaaa aa aaa aaaaaaaa aaaaa aaa aa aaaaa aa aaaaa aaa aaaaa aaaaa aa aaa aaaaaa aa aaaaaaaaa.","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaaaaa","aaaaaaa":"aaaaa aaaaaaaa aaa aaaa aaaaaaa aaaa aaaaaa aaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaa aaaa","aaaaaaa":"aaaa aaaa aaaa aaaa aaaaaaaaaaa aaaa aaa aaa aaaaaaaaa aaaa aaa aa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"}],"aaaa_aaaaaaa":"","aaaa_aaa":"\u00a0000.00","aaaaaaaaa_aaaaaa":"\u00a00,000.00","aaaaaaaaa_aaaaa":"\u00a00,000.00","aaaaaaa_aaaa":"aaaa:\/\/aaa.aaaaaaaaaa.aaa\/\/aaaaa\/aaaaaaa.aaaa?aaaa=aaaaaaa&aaaaaaaaa=aaaaaaaaaaa&aaaaa=000&aaaaaa=000&aaa=aaaa_aaaa0.aaa","aaaaaaaaa_aaaaaa":"\u00a00,000.00","aaaaaaaaa_aaaaaaa":"\u00a00.00","aaa_aaaaaa":true,"aaaaaaaaaa_aaaaaaaa":00} 

내가 않도록하고 싶습니다 : 다음은 익명으로 응답 데이터는 서버 부하를 최소화하기 위해 내 도메인의 서버에서이 작업을 수행해야합니다.

+1

결과 JSON이 유효한 형식인지 확인하십시오. –

+2

sanitize 버전을 게시하지 않으면 리턴 코드가 잘못되었음을 알 수 없습니다. – Lazarus

답변

1

jQuery 1.4의 JSON 구문 분석은 이전 버전보다 엄격합니다. 브라우저에 따라 eval과 다른 기본 JSON 구문 분석을 사용할 수 있습니다. 큰 차이점 중 하나는 모든 키를 작은 따옴표로 묶지 말고 큰 따옴표로 묶어야한다는 것입니다. 당신이 말한 것처럼 eval은 아무런 오류없이 그것을 할 것입니다. 왜냐하면 JS는 속성 이름을 전혀 인용하지 않기 때문에 JSON 구문 분석을 실패하게됩니다.

프로젝트를 jq 1.4로 변환 할 때 json 문자열을 수동으로 작성하는 이전 코드가 있으므로이 문제가 발생했습니다. 그들은 항상 유효한 JSON을 생산으로

return '{"a":12}'; // works 
return json_encode(array('a'=>12)); // preferred! 
return json.dumps({'a':12}) # etc. 

: 예를

return "{'a':12}"; // fails parsing due to single quotes 

를 들어이 내장 된 JSON 라이브러리를 사용하는 것이 훨씬 낫다.

+0

당신이 옳다고 생각합니다. 응답 데이터에는 이스케이프 처리되지 않은 값이 몇 가지 있습니다. 문제는 내가 데이터를 요청한 도메인을 소유하고 있지 않기 때문에 jQuery의 JSONP 처리를 가로 채기 전에 내장 eval 함수라고 부르는 것인가? –

+0

데이터를 문자열로 가져온 다음 eval 또는 json.parse를 호출 할 수 있습니다. – JAL

+0

감사합니다. 문제는 jQuery가 JSONP를 처리하는 방식에있는 것 같습니다. 내부 구조에 대해서는 알지 못하지만, 스크립트처럼 가져오고, 브라우저가 jQuery에 제어권을 넘겨주기 전에 브라우저에서 구문 문제를 발견하고 오류를 던집니다. beforeSend() 또는 dataFilter()도 트리거되지 않습니다. 내 서버에서 처리 만하면 될 것 같습니다. –

0

JSON 샘플이 유효하지 않습니다. 여기에는이 하위 문자열이 포함됩니다.

}, { 

즉, 하나의 개체를 종료하고 다른 개체를 시작합니다. 따라서 대괄호를 사용하지 않고 객체의 배열처럼 보입니다.

편집 : 내 실수! 그것은 실제로 그것에 중첩 배열을 가지고 않습니다. 어쩌면 당신이 그것을 생성 할 때 "꽤 인쇄"해야한다. 그래서 문제가있는 곳을보기가 더 쉽다.

0

흥미롭게도, http://jsonformatter.curiousconcept.com/에 따르면 JSON이 유효합니다. 다른 사람들이 지적했듯이

... jQuery를 1.4 잘못된 JSON을 수락하지 않습니다, 이전 버전의 것입니다 그러나

어떻게 당신이 실제 JSON 데이터 요소를 호출 (당신은 어떤 미친 이유 방향으로 이동합니다. 원하는 경우) 암호? 두 번 문제가 생겼습니다 ... JSON을 완벽하게 유효하지만 jQuery에서 쉽게 호출 할 수 없습니다.

예 : tumblr (블로그 엔진) API ... 어떤 이유로 든 ... "-"... 블로그 게시물의 "본문"에는 "정규 본문"이 있습니다. 어떤 jQuery는 분명히 열정으로 싫어한다.

당신은 할 수 있다고 생각합니다.

json.posts[2].regular-body 

하지만 그 오류 것입니다, 그래서 당신은 어떻게 당신이 JSON 데이터를 호출에 대해 더 자세히 줄 수있는 경우에 당신은 ... [] 그래서

json.posts[2]['regular-body'] 

...

필요 요소 도움이 될 것 같습니까?

+0

getJSON 함수 내에서 스크립트가 오류로 인해 종료되므로 JSON 데이터의 개별 요소를 쿼리 할 수 ​​없습니다. –

0

나는 지금도 같은 문제를 겪고 있는데, 내 서버는 정확한 json 데이터로 응답합니다. 나는 당신이 사용한 동일한 코드 패턴을 따릅니다. 나는이 오류를 해결하기 위해 여기에 언급하기 전에 R & D를 작성했다. 우리가 "callback =?" url에서는 객체를 JSONP로 요청하는 경향이 있습니다. JSONP에서 응답이 오는 것으로 가정하지만 응답은 순수한 JSON 형식으로 제공됩니다. 일단 응답은 JSON과는 달리 JSONP에 따라 구문 분석을 시도합니다. 내가 틀렸다면 문제를 해결하고 문제가 해결되었는지 알려주십시오. 감사.

관련 문제