배경: 대부분의 브라우저는 json 객체를 문자열로 변환하기 위한 기본 API 지원을 구현했습니다. 그렇다면 모두가 선호하는 IE6와 같은 하위 버전 브라우저에서 이를 구현하는 방법은 무엇입니까?
먼저 다음 메서드를 실행하여 다양한 상황에서 JSON.stringify의 출력을 테스트합니다. 이는 다음 코드의 구현 및 테스트에 도움이 됩니다. 사용 사례가 완전하지 않을 수 있습니다. 추가를 환영합니다
함수 test_toStringify(){
var 결과 = {
"JSON.stringify(정의되지 않음)": JSON.stringify(정의되지 않음),
"JSON.stringify(null)": JSON.stringify(null) ),
"JSON .stringify(123)": JSON.stringify(123),
"JSON.stringify(true)": JSON.stringify(true),
"JSON.stringify('' )": JSON.stringify( ''),
"JSON.stringify('abc')": JSON.stringify('abc'),
"JSON.stringify(null)": JSON.stringify( null),
" JSON.stringify([1,2,3])": JSON.stringify([1,2,3]),
"JSON.stringify([정의되지 않음, 정의되지 않음])": JSON.stringify([정의되지 않음, 정의되지 않음]),
"JSON.stringify({이름:'chyingp', 연령:24, u:정의되지 않음})": JSON.stringify({이름:'chyingp', 연령: 24, u:정의되지 않음})
};
var str = '';
for(var key in result){
if(typeof result[key] === 'string'){
str = 키 " : '" 결과[키] "'n";
}else{
str = 키 " : " 결과[키] "n"
}
}
console.log( str);
}
test_toStringify();
출력 결과는 다음과 같습니다.
JSON.stringify(undefine) : 정의되지 않음
JSON.stringify(null) : 'null'
JSON.stringify(123) : '123'
JSON.stringify(true) : 'true'
JSON.stringify('') : '""'
JSON.stringify('abc' ) : '"abc"'
JSON.stringify ([1,2,3]) : '[1,2,3]'
JSON.stringify([정의되지 않음, 정의되지 않음]) : '[null, null]'
JSON.stringify({이름: 'chyingp', age:24, u:undefine}) : '{"name":"chyingp","age":24}'
다음은 json 객체를 문자열로 변환하는 코드 구현입니다.
function is_number(obj){ return Object.prototype.toString.call(obj)==='[객체 번호]' }
function is_boolean(obj){ return Object.prototype.toString .call(obj)==='[객체 부울]'; }
function is_string(obj){ return Object.prototype.toString.call(obj)==='[객체 문자열]' }
function is_null(obj){ return Object.prototype.toString.call(obj)= =='[object Null]' }
function is_undefine(obj){ return Object.prototype.toString.call(obj)== ='[객체 정의되지 않음]'; }
함수 is_object(obj){ return Object.prototype.toString.call(obj)==='[객체 객체]' }
함수 is_array(obj){ return Object.prototype.toString.call(obj)==='[객체 배열] '; }
function is_function(obj){ return Object.prototype.toString.call(obj)==='[객체 함수]' ; }
function quote(str){ return '"' str '" '; }
var basic_map = {
'[객체 정의되지 않음]': true,
'[객체 번호]': true,
'[객체 Null]': true,
' [객체 부울]': true
}
function basic_type(obj){ return basic_map[ Object.prototype.toString.call(obj ) ]; }
JSON = window.JSON || {}; 사실은 JSON.stringify
JSON.toStr = function(obj){
if(is_string(obj) ) || is_null(obj) || is_boolean(obj)) return quote(obj);
if(is_undefine(obj)) return obj;
var left = "[",
middle = [],
right = "]",
value
var callee =args.callee
for(var i= 0,len=obj.length; ivar value = obj[i]
if( typeof value === 'undefine' ){
middle.push(null ' ');
}else{
if( basic_type(value) ){
middle.push( value )
}else{
middle.push( callee(obj[i]) )
}
}
}
return left middle.join( ",") right
}
if(is_object(obj)){
var left = "{ ",
middle = [],
right = "}",
value;
var callee =args.callee;
for(var key in obj){
var value = obj[key];
if(typeof obj[key] === '정의되지 않음') continue;
if( basic_type(value) ){
middle.push( quote(key) ':' value );
}else{
middle.push( quote(key) ' :' callee(value) )
}
}
return left middle.join(', ') right;
}
};
!JSON.stringify && (JSON .stringify = JSON.toStr);
위 코드는 연습용입니다. 중복성 및 효율성 문제. 틀린 부분이 있으면 지적해주세요 :)