>  기사  >  웹 프론트엔드  >  IE8 기본 JSON support_json

IE8 기본 JSON support_json

WBOY
WBOY원래의
2016-05-16 18:54:18963검색

이 새로운 기본 JSON 기능을 사용하면 Internet Explorer 8을 기존 AJAX 응용 프로그램에서 더 빠르고 안전하게 실행할 수 있습니다.

JSON이란 무엇인가요?

대부분의 개발자가 AJAX 프로그램만 개발하는 것은 아닙니다. 여기서 몇 가지 배경 지식을 소개하겠습니다. JSON은 사람이 읽을 수 있는 간단한 데이터 교환 형식입니다. AJAX 프로그램에서 이 형식은 일반적으로 서버와 웹 프로그램 간에 데이터를 전송할 때 사용됩니다.

예를 들어 즐겨찾는 웹메일에서 연락처 이름을 선택하면 연락처 정보를 볼 수 있습니다. 서버에서 웹 프로그램(브라우저에서 실행)으로 보낸 데이터 스트림은 다음과 같습니다.

{
"firstName": "cyra",
"lastName": "richardson ",
"address": {
"streetAddress": "1 Microsoft way",
"city": "Redmond",
"state": "WA",
"postalCode ": 98052
},

"phoneNumbers": [
"425-777-7777",
"206-777-7777"
]
}

다행히 이 형식은 JavaScript의 구문과 완벽하게 호환됩니다. 오늘날 많은 프로그램은 Javascript의 eval() 함수를 사용하여 얻은 데이터를 Javascript 객체로 변환합니다. eval()을 사용하는 것은 안전하지 않으며 리소스를 소모합니다. eval()은 이 문자열을 Jscript 표현식으로 구문 분석하고 실행합니다. eval()에 전달된 문자열이 변조된 경우 예상하지 못한 데이터가 포함될 수 있으며 웹 애플리케이션에 삽입될 수 있는 다른 사람의 코드도 포함될 수 있습니다.

요즘에는 신뢰할 수 없는 JSON 데이터를 보다 안전하게 구문 분석하기 위해 Javascript로 작성된 라이브러리가 많이 있습니다. Jscript(http://www.json.org/json_parser.js)로 작성된 일부 파서는 데이터에 대해 엄격한 검증을 수행하며, json2, js(http://www.json.org/json2.js)와 같은 일부 라이브러리는 정규식을 사용하여 입력 문자열을 종합적으로 확인한 다음 eval()을 사용하여 빠르게 구문 분석합니다. 이상적인 솔루션은 코드 삽입으로부터 애플리케이션을 보호하고 빠르게 실행되며 어디에서나 사용할 수 있는 기본 구현입니다.

IE8 Jscript의 기본 JSON

IE8의 Jscript 엔진은 이미 JSON의 완전한 기본 구현을 갖추고 있으며 ES3.1 제안 작업 초안과 일치합니다. 주소 http://wiki.ecmascript.org/doku.php?id=es3.1:es3.1_proposal_working_draft)에 설명된 JSON 지원의 호환성을 유지하면서 직렬화 및 역직렬화 속도를 크게 향상시키고 보안을 향상시킵니다. 신뢰할 수 없는 데이터를 구문 분석합니다.

API

수정하거나 재정의할 수 있는 새로운 내장 개체 "JSON"을 정의합니다. 수학이나 기타 내장된 전역 개체와 매우 비슷해 보입니다. JSON 객체 외에도 toJSON()과 같은 특정 함수도 Date, Number, String 및 boolean 객체의 프로토타입에 추가되었습니다. JSON 객체에는 두 가지 메서드(parse() 및 stringify())가 있습니다.

예:

var jsObjString = "{"memberNull" : null, "memberNum" : 3, "memberStr" : "StringJSON", "memberBool" : true , "memberObj" : { "mnum" : 1, "mbool" : false}, "memberX" : {}, "memberArray" : [33, "StringTst",null,{}]";
var jsObjStringParsed = JSON.parse(jsObjString ) ;
var jsObjStringBack = JSON.stringify(jsObjStringParsed);

parse() 메서드에 의해 생성되고 stringify() 메서드를 통해 다시 직렬화되는 개체는 다음 개체와 정확히 동일합니다.

var jsObjStringParsed =
{
"memberNull" : null,
"memberNum" : 3,
"memberStr" : "StringJSON",
"memberBool" : true ,
"memberObj" :
{
"mnum" : 1,
"mbool" : false
},
"memberX" : {},
"memberArray" :
                                                                            
};


JSON.parse(source, Revival )


JSON.parse 메서드는 JSON 형식의 문자열( 매개변수 소스에 의해 지정됨) Jscript 개체 또는 배열을 생성합니다.
선택적 매개변수인 Revival은 구문 분석의 변경 사항을 설명하는 데 사용되는 사용자 정의 함수입니다. 결과 객체나 배열은 재귀적으로 순회되며, 각 멤버에 부활 기능이 사용되며, 각 멤버 값은 부활의 반환 값으로 대체됩니다. Reviver가 null을 반환하면 개체 구성원이 삭제됩니다. 순회 및 부활자 호출은 후순 순회에서 완료됩니다. 즉, 개체의 모든 구성원이 "소생"된 후에 전체 개체도 "소생"됩니다.
reviver는 주로 ISO와 같은 문자열을 식별하고 이를 Date 객체로 변환하는 데 사용됩니다. 지금까지 JSON 형식(http://www.json.org/)은 Date 개체에 대해 앞뒤로 변환할 수 없습니다. 이는 Jscript에 표준 Date 텍스트 크기가 없기 때문입니다. ES3.1 초안(http://wiki.ecmascript.org/doku.php?id=es3.1: es3.1_proposal_working_draft)에는 이 문제를 해결하기 위해 부활 기능을 사용하는 방법에 대한 예가 포함되어 있습니다.


JSON.stringify(value, replacement, space)


직렬화 방식입니다. value 매개변수로 지정된 객체 또는 배열을 매개변수로 사용하고 JSON 형식의 문자열을 생성합니다. 객체 또는 배열은 재귀적으로 액세스되며 특정 JSON 형식으로 직렬화됩니다. value 매개 변수에 toJSON() 메서드가 있는 경우 이 메서드는 첫 번째 필터 역할을 하며 원래 값은 value.toJSON(key)로 대체되고 최종 값은 직렬화됩니다. 매개변수 키는 문자열입니다. (key:value)와 같은 객체가 직렬화되면 키는 멤버의 이름입니다. 루트 객체의 경우 키는 빈 문자열입니다.
Date.prototype.toJSON()은 이스케이프가 필요하지 않은 문자열을 생성하며 진정한 직렬 변환기입니다. stringify()는 변경 사항 없이 원래 문자열을 반환하기 때문입니다. 날짜 객체는 toJSON() 메서드를 통해 직렬화됩니다.
Number.prototype.toJSON(), String.prototype.toJSON(), Boolean.prototype.toJSON() 함수는 ValueOf()를 반환합니다. "var num = new Number(3.14);"와 같은 객체의 적절한 직렬화에 사용됩니다.

선택적인 대체 매개변수는 필터 역할을 하며 재귀적으로 사용됩니다. 함수일 수도 있고 배열일 수도 있습니다. replacement가 함수인 경우 각 객체 멤버 key:value에 대해 replacement(key,value)가 호출됩니다. 루트 객체의 경우, replacement("",value)를 호출하세요. 교체자가 배열인 경우 배열 문자열이어야 합니다. 배열의 요소는 직렬화할 멤버의 이름입니다. 직렬화 순서는 배열의 이름 순서에 따라 결정됩니다. 배열을 직렬화할 때 배열 대체자는 무시됩니다.

선택적 매개변수 공백은 출력 텍스트의 형식을 지정하는 방법입니다. 이 매개변수를 생략하면 출력 텍스트에 추가 공백이 없습니다. 숫자인 경우 각 들여쓰기 수준에 대한 공백 수를 지정합니다. 문자(예: "t" 또는 " ")인 경우 해당 문자로 각 문자 수준을 들여씁니다.


기존 웹페이지에 어떤 영향을 미칠까요?


ES3.1 JSON 제안은 인기 있는 json2.js에서 사용되는 주요 요소입니다. JSON이라는 이름도 사용합니다. 전역 객체 JSON은 재정의될 수 있습니다. 그러나 더 이상 정의되지 않은 개체가 아닙니다. 이는 스크립팅 언어에 new 키워드를 도입하는 것과 같습니다. 이름을 채택하면 기존 코드에 영향을 미치는 경우가 있습니다. json2.js를 사용하는 페이지는 영향을 받을 가능성이 없습니다.극소수의 예외를 제외하고 이러한 모든 페이지는 계속해서 정상적으로 작동하며 더 빠르게 작동합니다.

자체 JSON 개체 정의를 구현하는 페이지, 특히 "if(!this.JSON) { JSON=...}"과 같은 패턴을 사용하여 정의된 JSON 개체가 영향을 받을 수 있습니다. 이 문제를 해결하는 두 가지 주요 방법이 있습니다.

1. 기존 코드를 마이그레이션하고 기본 JSON 개체를 사용합니다.
JSON 구현이 json2.js의 일부 버전을 기반으로 하는 경우 이를 마이그레이션하는 것은 매우 간단합니다.

2. 기본 JSON 지원을 사용하지 않기로 결정하고 기존 JSON 개체를 계속 사용합니다.
JSON 이름을 바꾸거나 다시 작성하면 됩니다. 이름 바꾸기는 JSON 이름을 사용하는 모든 코드를 "MyJSON"과 같은 이름으로 변경하는 것을 의미합니다. 다시 작성한다는 것은 자체 JSON 정의가 기본 기본 JSON 정의를 사용하는 모든 코드를 재정의한다는 것을 의미합니다. 대부분의 경우 "if(!this.JSON)" 조건을 제거하면 효과가 있습니다.

3.1 표준의 영향을 고려하면 JSON이라는 이름을 사용하는 것은 잘 정의된 인터페이스를 통해 상호 운용하려는 우리의 바람과 일치합니다.

네이티브 JSON에 관해 할 말이 많습니다. 파서는 eval()을 기반으로 하지 않으며 별도의 구현입니다. JSON 지원(http://wiki.ecmascript.org/doku.php?id=es3.1:json_support)에서 제공하는 참조 파서와 동일합니다. 또한 http://www.json.org/json_parser.js만큼 안전하며 훨씬 빠르게 실행됩니다. 따라서 eval() 또는 자체 JSON 라이브러리를 사용하는 경우 더 나은 성능과 안전한 작업을 위해 IE8의 기본 JSON 구현을 확인하세요.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.