2013-03-15 4 views
0

을 가진이 JSON을 구문 분석 할 수 없습니다, 가장 간단한 예는 어느 하나의 행을 잡고있다 :내가 어떤 JSON 데이터를 받고 있어요 jQuery를

{ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] } 

잘 형성 될 것 같다

>>> console.log({ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] }) 
Object { max=[1]} 

비록, 내가하려고하면 왜이

>>> $.parseJSON("{ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] }"); 

SyntaxError: JSON.parse: expected property name or '}' 

입니까?

JavaScript Object Notation과 Strict JSON의 차이점을 알지 못했습니다. 이러한 데이터

{ "max": [[1353007547000,70.0000]] } 

컨텍스트를 통해 일부 AJAX HighCharts 데이터를 로딩하기위한했지만 모두 실시 예는 상술 한 형식 산세 AJAX 있었다 : I는 다음과 같이 출력으로 바꿨다.

+1

음 ... JSON이 유효하지 않습니다.* "잘 만들어진 것 같습니다."* :이 경우 JavaScript로 해석하고 유효한 객체 리터럴이지만 JSON과 다른 것입니다. –

+4

잘못되었습니다 - 먼저 확인하십시오 http://jsonlint.com/ – Terry

답변

2

당신은 여전히 ​​ 아니라 진정한 JSON보다는 JSON과 같은 인 자바 스크립트 객체 에서 다루고 있습니다. .parseJSON의 경우 엄격한 JSON을 원한다.

즉, Date 객체는 문자열이어야하며 속성 이름은 큰 따옴표로 묶어야합니다.

http://jsonlint.com/과 같은 도구는 종종 매우 유용 할 수 있습니다.

@ c4p는 JavaScript 객체에서 JSON.stringify를 사용하는 것이 좋습니다. 이는 종종 구문 분석 전에 조정해야 할 많은 작업을 처리하기 때문에 좋은 첫 번째 단계입니다.

+0

* "JSON과 비슷한 JavaScript 객체"* 나에게 이상한 소리가납니다 ... 객체 리터럴 표기법과 JSON은 공통점이 있습니다. 다른 사람으로부터 영감을 얻은 것입니다. 나는 당신의 진술이 리터럴 구문과 JSON의 차이를 더욱 혼란스럽게 만든다고 생각합니다. –

+0

@FelixKling 그 문구가 정말로 이상하다는 데 동의합니다. 그러나 JSON과 JavaScript 객체의 차이점을 생각해 본 사람들에게이 차이를 설명 할 때 먼저 모호한 유사성을 끄는 것이 중요합니다. 그것은 당신이나 내가 이상하게 들릴지 모르지만, 우리가 이미 문자적인 구문과 표기법의 근본적인 차이점을 이미 이해하고 있기 때문입니다. 아마도 JavaScript 객체가 JSON (JavaScript Object Notation)과 비슷하게 보일 수도 있지만 유사성은 일단 물리적 외관을 지나면 끝납니다. – purgatory101

7

JSON은 엄격한 표준으로, 자바 스크립트의 하위 집합입니다. Date은 빠뜨리는 것들 중 하나입니다. 날짜가 필요하면 문자열 (또는 int)로 전송해야합니다. 코드가 유효한 자바 스크립트이지만 유효한 JSON이 아닙니다.

1

당신은 JSON에 자바 스크립트 객체를 덤프 경우

JSON.stringify({ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] }); 

"{"max":[[1361538673000,999]]}" 

사항은 max 키는 문자열 "max"되었고, Date은 타임 스탬프로 변환되었다.

0

날짜는 자바 스크립트 객체이며 JSON의 일부가 아닙니다. 직렬화 된 양식을 통해 javascript 함수 호출을 전달하려고하면이 작동하지 않습니다.

콘솔 로그에서 작동하는 이유는 console.log가 호출되기 전에 Date.UTC 함수가 값으로 해석되기 때문입니다. 이 문자열은 eval (리터럴 자바 스크립트를 실행하는)에 전달되어 원래 함수로 실행될 가능성이 높으며 parseJSON (어느 것이 좋습니다!)을 사용하여 취약성을 줄이려고 시도하는 것 같습니다.

여기 해결책은받는 JSON 데이터에 대한 제어 범위에 따라 다릅니다. 컨트롤이 0이면 eval을 사용해야 할 수도 있습니다. 그렇지 않으면 json에는 UTC에 전달 된 매개 변수 (또는 타임 스탬프 자체)의 배열이 포함되어야하며 구문 분석이 끝나면 결과에 Date.UTC를 호출하여 UTC 날짜를 가져와야합니다.

관련 문제