programing

jQuery가 AJAX의 JSON을 구문 분석하지 않음

megabox 2023. 3. 10. 21:24
반응형

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" } ]

success 함수가 호출되어 올바른 개체를 수신합니다.

그러나 단일 개체를 반환하려고 할 때는 다음과 같이 하십시오.

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

오류 함수가 호출되고 xhr에 'parserror'가 포함됩니다.서버에서 JSON을 괄호 안에 싸서 전송해 보았습니다만, 별 차이가 없습니다.그러나 Javascript의 문자열에 내용을 붙여넣고 eval() 함수를 사용하면 완벽하게 평가됩니다.

내가 뭘 잘못하고 있는지 알기나 해?

앤서니

가 Content-Type "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'}

작전본부의 문제는 아니지만, 이곳에 도착한 다른 사람들에게 주목할 가치가 있다고 생각했다.

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

beforeSend 속성을 사용하여 MIME 유형을 덮어쓰는 콜백 함수를 추가합니다.이렇게 하면 서버에서 잘못된 MIME 유형이 전송되고 호출 코드가 수신되는 경우에도 코드가 json을 처리하도록 속입니다.다음은 코드 예시입니다.

질문에 따르면 적절한 MIME 타입은 application/json이지만, 제가 시도했을 때 application/json이 작동했다는 것을 알고 있습니다(몇 년 전).먼저 어플리케이션/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+')')

개체에서 데이터를 반환받는데 나중에 parentematic에서 missing() 오류가 발생하는 다른 문제가 발생했으며 jQuery에는 json 구조에 대한 문자열을 평가하기 위한 특정 함수가 있음을 발견했습니다.

$.parseJSON(data)

효과가 있을 거야이것은 물론 json 문자열이 올바른 형식으로 되어 있는 것에 더해서입니다.

json 응답을 에코아웃하고 헤더가 */json과 일치하지 않으면 내장된 jQuery.parseJ를 사용할 수 있습니다.응답을 해석하는 SON 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);

(예를 들어 세미콜론 또는 줄바꿈으로 구분된 여러 개의 구를 포함하지 않음)

다음과 같이 php에 헤더 콘텐츠 유형을 설정해야 합니다.

 <?php

 header('Content-type:application/json');

 ?>

자세한 것은, 이 비디오를 봐 주세요.

참고 자료: http://www.youtube.com/watch?v=EvFXWqEqh6o

ASP를 소비하고 있는 경우.jQuery를 사용하는 NET Web Services에서 web.config에 다음 항목이 포함되어 있는지 확인합니다.

<webServices>
    <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
    </protocols>
</webServices>

Firefox 3.5는 정상적으로 작동하고 JSON 데이터를 구문 분석했지만 Firefox 3.0.6은 구문 분석 오류를 반환했습니다.파이어폭스 3.0.6의 에러가 발생한 것은, JSON 의 선두에 공백이 있는 것이 판명되었습니다.빈 공간을 제거하여 수정

기술 "eval()"과 "JSON.parse()"는 서로 배타적인 형식을 사용합니다.

  • "eval()" 괄호는 필수입니다.
  • "JSON.parse()" 괄호는 사용할 수 없습니다.

"eval" 형식을 생성하는 "stringify()" 함수가 있습니다.ajax의 경우 JSON 형식만 사용해야 합니다.

"eval"에는 JavaScript 언어 전체가 포함되어 있지만 JSON은 언어의 극히 일부만 사용합니다."eval"이 인식해야 하는 JavaScript 언어의 구성 요소로는 "Block statement"(일명 "compound statement")가 있습니다. 이 구성 요소는 일부 문이 포함된 쌍 또는 중괄호 "{}"입니다.단, 오브젝트 리터럴 구문에는 물결 괄호도 사용됩니다.해석은 코드가 표시되는 컨텍스트에 따라 구분됩니다.어떤 것이 오브젝트 리터럴처럼 보일 수 있지만, "eval"은 그것을 복합적인 문장으로 간주합니다.

JavaScript 언어에서 객체 리터럴은 할당 오른쪽에 발생합니다.

var myObj = { ...some..code..here... };

객체 리터럴은 저절로 발생하는 것이 아닙니다.

{ ...some..code..here... }   // this looks like a compound statement

2008년 OP의 첫 번째 질문으로 돌아가서 그는 "eval()"에서 다음과 같은 문제가 발생하는 이유를 물었다.

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

정답은 그것이 복합적인 진술처럼 보인다는 것이다.오브젝트로 변환하려면 복합문을 사용할 수 없는 컨텍스트에 넣어야 합니다.그것은 괄호를 둘렀을 때 행해집니다.

( { title: "One", key: "1" } )    // not a compound statment, so must be object literal

OP는 또한 유사한 진술이 성공적으로 평가된 이유를 물었다.

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

같은 답변이 적용됩니다.컬리 괄호는 복합문을 사용할 수 없는 컨텍스트에 있습니다.맥락입니다[...]오브젝트를 할 수 할 수 없습니다.

"eval()"과 달리 JSON의 기능은 매우 제한적입니다.이 제한은 의도적인 것입니다.JSON 설계자는 할당 오른쪽에 표시될 수 있는 구문만 사용하여 JavaScript의 최소 하위 집합을 의도했습니다.JSON에서 올바르게 해석되는 코드가 있으면...

var myVar = JSON.parse("...some...code...here...");

...그것은 이렇게 과제의 오른쪽에 있는 것도 합법적으로 해석할 수 있다는 것을 의미합니다.

var myVar = ...some..code..here... ;

하지만 JSON에 대한 제한은 그것뿐만이 아니다.JSON의 BNF 언어 사양은 매우 간단합니다.예를 들어 문자열(JavaScript 및 Perl 등)을 나타내기 위해 작은 따옴표를 사용할 수 없으며 단일 문자를 바이트로 표현하는 방법('C'처럼)도 없습니다.아쉽게도 코멘트도 사용할 수 없습니다(컨피규레이션파일을 작성할 때 매우 편리합니다).이러한 모든 제한의 장점은 JSON의 해석 속도가 빠르고 코드 주입(보안 위협)을 할 기회가 없다는 것입니다.

이러한 제한으로 인해 JSON에서는 괄호를 사용할 수 없습니다.따라서 JSON 문자열의 괄호는 부정한 문자입니다.

다음과 같은 이유로 항상 Ajax와 함께 JSON 형식을 사용하십시오.

  • 일반적인 Ajax 파이프라인이 JSON용으로 구성됩니다.
  • "eval()" 사용은 보안 위험으로 비판됩니다.

Ajax 파이프라인의 예로 노드 서버와 jQuery 클라이언트를 포함하는 프로그램을 생각해 보십시오.은 "jQuery" 합니다.$.ajax({dataType:'json',...etc.});는 나중에 후 합니다. JQuery는 나중에 사용하기 위해 jqXHR 개체를 만든 후 관련 요청을 패키징하여 전송합니다.서버는 요청을 수락하고 처리한 후 응답할 준비가 됩니다.합니다.res.json(data)패키지화하여 응답을 보냅니다.클라이언트 측에서는 jQuery가 응답을 받아들여 관련 jqXHR 개체를 참조하고 JSON 형식의 데이터를 처리합니다.이 모든 것이 수동 데이터 변환 없이 작동합니다.응답에는 노드 서버의 JSON.stringify()에 대한 명시적 콜이 포함되지 않으며 클라이언트의 JSON.parse()에 대한 명시적 콜도 포함되지 않습니다.이 모든 것이 처리됩니다.

"eval"의 사용은 코드 주입 보안 위험과 관련이 있습니다.당신은 그것이 일어날 수 있는 방법이 없다고 생각할 수 있지만, 해커들은 꽤 창의적일 수 있다.또한 Javascript 최적화에는 "eval"이 문제가 됩니다.

stringify() 함수를 사용하는 경우 해당 이름의 일부 함수는 JSON이 아닌 "eval"과 호환되는 문자열을 작성합니다.예를 들어 노드에서는 "eval" 호환 형식의 문자열을 작성하는 함수를 다음에 나타냅니다.

var stringify = require('node-stringify'); // generates eval() format

이것은 유용할 수 있지만, 특별한 필요가 없는 한, 아마 당신이 원하는 것이 아닐 것입니다.

어레이를 반환할 수 있지만 단일 개체를 반환할 수 없는 경우 단일 개체를 포함하는 어레이로 반환할 수도 있습니다.

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

이렇게 하면 데이터 페이로드에 관계없이 일관된 데이터 구조와 객체 배열을 반환할 수 있습니다.

단일 오브젝트를 "parenthesis"로 래핑하려고 시도한 것을 알 수 있습니다.또한 JavaScript는 [..]를 (..)와 다르게 취급하기 때문에 예를 들어 제안합니다.

jQuery 오류 핸들러가 호출되고 XHR 개체에 "파서 오류"가 포함되어 있는 경우 서버에서 반환되는 파서 오류일 수 있습니다.

파라미터를 지정하지 않고 서비스를 호출했을 때 단일 레코드를 취득하기 위해 파라미터를 제공하려고 할 때 여러 결과 시나리오가 중단됩니까?

어느 백엔드에서 반환하시겠습니까?

예를 들어 ASMX 서비스에서는 파라미터가 JSON 문자열이 아닌 JSON 오브젝트로 jQuery에 제공되는 경우가 많습니다.jQuery에서 "data" 파라미터에 실제 JSON 객체를 지정하면 JSON으로 전송하지 않고 표준 및 구분된k,v 쌍으로 시리얼화 됩니다.

일부 구현에서는 다음과 같은 사항을 추가해야 했습니다.

obj = new Object; obj = (data.obj);

문제가 해결된 것 같았어요.평가든 아니든 내게는 똑같은 일을 하는 것 같았다.

jQuery는 특정 JSON 키를 초크합니다.저는 이 JSON 스니펫을 PHP로 보내고 있었습니다.

echo json_encode((object) array('result' => 'success'));

'결과' 키의 이름을 다른 것으로 바꾸면 됩니다.이것은 일종의 예약된 단어 충돌이며 jQuery(1.4.2)의 버그일 수 있습니다.

ColdFusion 환경에서는 JSON이 올바르게 포맷되어 있어도 오류가 발생하는1가지 원인은 ColdFusion Administrator에서 [Enable Request Debuging Output]를 켜는 것입니다([Debug & Logging]> [ Debug Output Settings ] ) 。디버깅 정보는 JSON 데이터와 함께 반환되므로 무효가 됩니다.

이것도 먹어봐

$.ajax({
    url: url,
    data:datas,
    success:function(datas, textStatus, jqXHR){
    var returnedData = jQuery.parseJSON(datas.substr(datas.indexOf('{')));
})};

내 경우 서버는 '{' 앞에 알 수 없는 문자로 응답합니다.

상태 = parseerror 및 xhr.status = 200 이 표시됩니다.

문제는 JSON 응답 내의 URL에서 '\'이(가) '/'로 전환되어 이를 수정했다는 것입니다.

저는 이것과 씨름하고 있었습니다.데이터 오브젝트를 표시하기 위해 파이어 버그를 사용할 때까지 몇 시간을 보냈습니다.

var data = eval("(" + data.responseText + ")");
console.log(data.count);

사용하다

$data = yourarray(); 
json_encode($data)

서버측에서 사용할 수 있습니다.클라이언트 측에서는 Datatype JSON과 함께 ajax를 사용하고 문서 인코딩이 BOM과 함께 UTF-8이 아닌 UTF-8이어야 합니다.

언급URL : https://stackoverflow.com/questions/249692/jquery-wont-parse-my-json-from-ajax-query

반응형