淺談 JSON.stringify 方法

1、前言html

最近項目中,遇到須要將對象轉換成字符串進行傳遞,上次寫過一篇文章關於json字符串轉換成json對象,json對象轉換成字符串,值轉換成字符串,字符串轉成值。當時主要是用在有時候處理字符串和json對象之間的轉換,寫的主要是怎麼用,涉及到JSONstringify具體用法沒有涉及到,有時候對於一個JSON.stringify自帶的方法掌握一下,可能會對於一個問題有更快的解決方案。node

文章同步的社區:http://www.mwcxs.top/page/426.html json

 

2、用法實例數組

一、方法的定義瀏覽器

二、JSON.stringify提供了參數分離出本身須要的那部分數據函數

三、JSON.stringify提供了參數回調函數作一個映射關係post

四、JSON.stringify提供了參數格式化字符串編碼

 

用過JSON都知道,把一個對象經過stringify以後變成字符串,再提交給後臺或者存儲在storage是很經常使用的手段(storage是存的key,value;value只能存字符串,而不能是json對象)。spa

var data =[
{
    name: "程咬金",sex:"1",age:26    
},
{
    name: "程才",sex:"0",age:20
},
{
    name: "程新鬆",sex:"1",age:22    
},
{
    name: "程功",sex:"1",age:18    
}
];
console.log(data,'數組');
var str_json = JSON.stringify(data);
console.log(str_json,'字符串');

這個是平常的用法,很是簡單。code

 

一、方法的定義

JSON.stringify ( value [, replacer] [ , space] )

參數:

(1)value:必選,要轉換的值(包括全部的數據類型,一般是對象或者數組)

(2)replace:可選,用於要轉換結果的函數或者數組;若是replace是數組,僅僅是轉換具備該鍵值的成員,成員的轉換順序和鍵在數組中的順序一致;若是replace是函數,會傳入每個成員的鍵和值,使用的是返回值而不是原始值,若是函數返回的是undefined,則排除該成員。查看了JSON2的源碼,

  rx_escapable.lastIndex = 0;
        return rx_escapable.test(string)
            ? "\"" + string.replace(rx_escapable, function (a) {
                var c = meta[a];
                return typeof c === "string"
                    ? c
                    : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
            }) + "\""
            : "\"" + string + "\"";
    }

確認並不會傳入每一個成員的鍵和值,而僅僅以空字符串形式調用replacer函數。該函數的實質是自定義的用於轉化爲JSON字符串的函數。

 (3)space:可選, 向返回值JSON 文本添加縮進、空格和換行符以使其更易於讀取。

 若是省略space,則將生成返回值文本,而沒有任何額外空格。
 若是 space是一個數字,則返回值文本在每一個級別縮進指定數目的空格。 若是 space 大於 10,則文本縮進 10 個空格。
 若是 space是一個非空字符串(例如「\t」),則返回值文本在每一個級別中縮進字符串中的字符。
 若是 space 是長度大於 10個字符的字符串,則使用前 10 個字符。

 

二、JSON.stringify提供了分離出本身須要的那部分數據

好比說這個場景,咱們的數據很是的複雜,有相似頭像,暱稱,我的簽名等,但是我保存在本地,只須要用戶名,性別,怎麼搞?

方法一:能夠用遍歷數組從新提取一下

var data =[
{
    name: "程咬金",sex:"1",age:26    
},
{
    name: "程才",sex:"0",age:20
},
{
    name: "程新鬆",sex:"1",age:22    
},
{
    name: "程功",sex:"1",age:18    
}
];
/*平常用法*/
//console.log(data,'數組');
//var str_json = JSON.stringify(data);
//console.log(str_json,'字符串');

/*提取用戶名和性別*/
for(var i=0,new_data=[];i<data.length;i++){
    new_data.push({
        name: data[i].name,
        sex: data[i].sex
    });
}
var str_json = JSON.stringify(new_data);
console.log(str_json);

方法二:的確能夠這麼幹,可是JSON.stringify提供了參數分離出本身須要的那部分數據

var data =[
{
    name: "程咬金",sex:"1",age:26    
},
{
    name: "程才",sex:"0",age:20
},
{
    name: "程新鬆",sex:"1",age:22    
},
{
    name: "程功",sex:"1",age:18    
}
];
/*平常用法*/
//console.log(data,'數組');
//var str_json = JSON.stringify(data);
//console.log(str_json,'字符串');

/*提取用戶名和性別-方法1*/
//for(var i=0,new_data=[];i<data.length;i++){
//    new_data.push({
//        name: data[i].name,
//        sex: data[i].sex
//    });
//}
//var str_json = JSON.stringify(new_data);
//console.log(str_json);
/*提取用戶名和性別-方法2*/
var str_json = JSON.stringify(data,["name","sex"]);
console.log(str_json);

第二個參數只要傳入須要的keys數組,就很是輕鬆的處理這個

 

 3JSON.stringify提供了回調函數作一個映射關係

好比說,咱們把sex裏的1,0修改成男,女 ,那麼第二個參數能夠經過回調函數來處理這個映射關係。

var data =[
{
    name: "程咬金",sex:"1",age:26    
},
{
    name: "程才",sex:"0",age:20
},
{
    name: "程新鬆",sex:"1",age:22    
},
{
    name: "程功",sex:"1",age:18    
}
];
/*平常用法*/
//console.log(data,'數組');
//var str_json = JSON.stringify(data);
//console.log(str_json,'字符串');

/*提取用戶名和性別-方法1*/
//for(var i=0,new_data=[];i<data.length;i++){
//    new_data.push({
//        name: data[i].name,
//        sex: data[i].sex
//    });
//}
//var str_json = JSON.stringify(new_data);
//console.log(str_json);
/*提取用戶名和性別-方法2*/
//var str_json = JSON.stringify(data,["name","sex"]);
//console.log(str_json);

/*回調函數作一個映射關係*/
var str_json = JSON.stringify(data,function(key,value){
    if(key == 'sex'){
        return ["女",'男'][value];
    }
    return value;
});
console.log(str_json);

第二個參數很厲害,省去了很多的麻煩

 

四、JSON.stringify提供了參數格式化字符串

第三個參數,用於格式化字符串 

var data =[
{
    name: "程咬金",sex:"1",age:26    
},
{
    name: "程才",sex:"0",age:20
},
{
    name: "程新鬆",sex:"1",age:22    
},
{
    name: "程功",sex:"1",age:18    
}
];
/*平常用法*/
//console.log(data,'數組');
//var str_json = JSON.stringify(data);
//console.log(str_json,'字符串');

/*提取用戶名和性別-方法1*/
//for(var i=0,new_data=[];i<data.length;i++){
//    new_data.push({
//        name: data[i].name,
//        sex: data[i].sex
//    });
//}
//var str_json = JSON.stringify(new_data);
//console.log(str_json);
/*提取用戶名和性別-方法2*/
//var str_json = JSON.stringify(data,["name","sex"]);
//console.log(str_json);

/*回調函數作一個映射關係*/
//var str_json = JSON.stringify(data,function(key,value){
//    if(key == 'sex'){
//        return ["女",'男'][value];
//    }
//    return value;
//});
//console.log(str_json);

/*格式化字符串*/
var str_json = JSON.stringify(data,null,'\t');
console.log(str_json);
var str_json = JSON.stringify(data,['name','sex'],'\t');
console.log(str_json);

通常狀況下用不上,除了能夠用於導出這些數據,保存本地查看方便。

 

最後附上js的代碼,使用node就能夠運行這個js

var data =[
{
    name: "程咬金",sex:"1",age:26    
},
{
    name: "程才",sex:"0",age:20
},
{
    name: "程新鬆",sex:"1",age:22    
},
{
    name: "程功",sex:"1",age:18    
}
];
/*平常用法*/
//console.log(data,'數組');
//var str_json = JSON.stringify(data);
//console.log(str_json,'字符串');

/*提取用戶名和性別-方法1*/
//for(var i=0,new_data=[];i<data.length;i++){
//    new_data.push({
//        name: data[i].name,
//        sex: data[i].sex
//    });
//}
//var str_json = JSON.stringify(new_data);
//console.log(str_json);
/*提取用戶名和性別-方法2*/
//var str_json = JSON.stringify(data,["name","sex"]);
//console.log(str_json);

/*回調函數作一個映射關係*/
var str_json = JSON.stringify(data,function(key,value){
    if(key == 'sex'){
        return ['女','男'][value];
        /*該處註釋等價於return ['女','男'][value];*/
//        if(value == 0 ){
//            value = '女';
//        }else{
//            value = '男';
//        }
    }
    return value;
});
console.log(str_json);

/*格式化字符串*/
//var str_json = JSON.stringify(data,null,'\t');
//console.log(str_json);
//var str_json = JSON.stringify(data,['name','sex'],'\t');
//console.log(str_json);

 

注意:

一、JSON.stringify會自動把所要轉換內容中的漢字轉換爲Unicode編碼二、瀏覽器間有差異,個別瀏覽器會把將要提交表單內容中的Unicode編碼自動轉爲漢字(Chrome自動轉換,IE不轉)

相關文章
相關標籤/搜索