JS実現JSON.stringify


もっと読む
       JSON.strigifyは、ブラウザの高バージョンバンドの一つで、JSのObjtectオブジェクトをJSON文字列に変換する方法ですが、またIE 6の下には、JSONという対象は存在しませんので、この方法を使う場合は、互換性のあるコードを書く必要があります.JSON.strigifyのルールや注意点:対象が数字、null、bootleanの場合は、そのまま該当する文字列に変換すればいいです.しかし、string、function、undefined、object、arrayなどは、特殊な処理が必要です.
1.undefinedは、JSON.strigifyを使って処理する場合、対象がundefinedであれば、「undefined」を出力します.対象が配列の要素であれば、nullになります.例えば、「undefined」、stingifyの後に「null」になります.オブジェクトがobjectの要素である場合、この属性は存在しないものとして扱われ、出力されません.例えば、{a:1、b:undefined}、strigifyの後に「\」a\:::::"B属性はそのまま捨てられます.
2.文字列はつなぎ合わせる時に内部の二重引用符を処理しなければなりません.
コードは以下の通りです


/**
 * JSON stringify   
 * @author norkts
 * @version 1.0 2015-11-24 15:11        
 * @version 1.1 2015-11-24 15:19 norkts    JSON.stringify       
 * @version 1.2 2015-11-24 15:49 norkts     indexOf IE       ,   undefined      
 */
(function(NS){

    //    
    var simpleTypes = ["number", "boolean", "undefined", "string", "function"];
    
    //JSON.stringify    
    function stringify(object){
        var type = typeof object;
        
        //       ,            
        if(indexOf(simpleTypes, type) > -1){
            return parseSimpleObject(object);
        }

        //     
        if(object instanceof Array){
            var len = object.length;
            var resArr = [];
            for(var i = 0; i < len; i++){
                var itemType = typeof object[i];
                if(indexOf(simpleTypes, itemType) > -1){

                    //undefined    ,     null
                    if(itemType !=  "undefined"){
                        resArr.push(parseSimpleObject(object[i]));
                    }else{
                        resArr.push("null");
                    }
                    
                }else{
                    //    JS        
                    resArr.push(stringify(object[i]));
                }
            }
            
            return "[" + resArr.join(",") + "]";
        }
        
        //  object  
        if(object instanceof Object){
            if(object == null){
                return "null";
            }
            
            var resArr = [];
            
            for(var name in object){
                var itemType = typeof object[name];
                if(indexOf(simpleTypes, itemType) > -1){
                    //undefined    ,object    
                    if(itemType !=  "undefined"){
                        resArr.push("\"" + name + "\":" + parseSimpleObject(object[name]));    
                    }
                }else{
                    resArr.push("\"" + name + "\":" + stringify(object[name]));
                }
            }
            
            return "{" + resArr.join(",") + "}";
        }
    }
    
    function parseSimpleObject(object){
        var type = typeof object;
        if(type == "string" || type == "function"){
            return "\"" + object.toString().replace("\"", "\\\"") + "\"";
        }
        
        if(type == "number" || type == "boolean"){
            return object.toString();
        }
        
        if(type == "undefined"){
            return "undefined";
        }
        
        return "\"" + object.toString().replace("\"", "\\\"") + "\"";
    }
    
    function indexOf(arr, val){
    	for(var i = 0; i < arr.length; i++){
    		if(arr[i] === val){
    			return i;
    		}
    	}
        
        return -1;
    }
    
    /**
     *  stringify     
     * @param object       
     *
     */
    NS.stringify = function(object, isEncodeZh){
        var res = stringify(object);
        if(isEncodeZh){
            var encodeRes = "";
            for(var i = 0; i < res.length; i++){
                if(res.charCodeAt(i) < 0xff){
                    encodeRes += res[i];
                }else{
                    encodeRes += "\\u" + res.charCodeAt(i).toString(16);
                }
            }
            res = encodeRes;
        }
        
        return res;
    };
})(window);