javascript
java json.stringify_JSON.stringify() 方法
功能非常簡單的一個方法,但是有很多細節需要注意,本文通過代碼實例詳細介紹。
由此方法的名稱入手,從 simplify 單詞分析開始:
(1).simplify 是由 simple 衍化而來,加上 ify 后綴,變成一個動詞,功能是使 ... 簡單化。
(2).同樣的道理,stringify 是由 string 衍化而來,加上 ify 后綴,功能是使 ... 字符串化。
JSON.stringify() 的定義是將參數轉換為 JSON,其實就是將參數轉換為字符串。
當然轉換是需要遵循一定規則的,后面會分步進行詳細介紹。
語法結構:
```javascript
JSON.stringify(value [, replacer] [, space])
```
參數解析:
(1).value:必需,要被轉換的 JavaScript 值,通常情況下是對象直接量或者數組。
(2).replacer:可選,對 value 進行轉換的函數或者數組。
(3).space:可選,向返回的 JSON 中的內容添加縮進、空白和換行符以使其更易于閱讀。
上面對參數的作用做了一下簡單介紹,讓讀者對其有一個初步印象,具體作用在下面代碼實例中介紹。
**代碼實例如下:**
絕大多數時候此方法是對對象或者數組的操作,實際項目中最為常見。
又由于此方法的操作就是將參數轉換為 JSON,所以很多朋友想當然認為 JSON 只能是如下兩種類似形式:
```javascript
{
"webName":"先思考后編碼",
"url":"codingbefore.com",
"age":2
}
```
再來看一個和數組相互嵌套的形式:
```javascript
{
"web": [
{ "webName":"先思考后編碼" , "url":"codingbefore.com" },
{ "webName":"網易" , "url":"163.com" }
]
}
```
其實并不是只有上述兩種形式,看如下代碼實例:
```javascript
console.log(JSON.stringify(5));
console.log(JSON.stringify(true));
console.log(JSON.stringify("antzone"));
console.log(JSON.stringify(null));
console.log(JSON.stringify(undefined));
console.log(JSON.stringify(function(){}));
console.log(JSON.stringify(Symbol("前端教程")));
```

具有結果的都是JSON數據,并不僅僅是對象或者數組被轉換后的字符串是JSON。
上述代碼分析如下:
(1).數字會被轉換為字符串"5"。
(2).布爾值true被轉換為字符串"true"。
(3).字符串"antzone",打印結果帶有雙引號,字符串本身帶有雙引號,JSON.stringify()方法將"antzone"整體作為字符串處理,所以處理的結果是"\"antozne\"",如果是用單引號包裹,也會被轉換為雙引號。
(4).null會被轉換為字符串"null"。
(5).undefined、function函數和Symbol數據會被忽略。
```javascript
console.log(JSON.stringify(new Date()));
```
代碼運行效果截圖如下:

打印出一段與時間日期相關的字符串,這是因為時間日期對象具有toJSON方法。
轉換過程中,如果對象具有toJSON方法,那么會首先調用此方法,具體參閱[toJSON() 方法](http://www.codingbefore.com/article-8584-1.html)一章節。
```javascript
let antzone={
webName:'先思考后編碼',
target:"分享互助",
age:5
}
console.log(JSON.stringify(antzone));
```
上述代碼只有一個參數,可以看到屬性被雙引號包裹,這一點要特別注意,一定是雙引號。
如果屬性值原本是字符串,那么一定也要用雙引號包裹,如果原來是單引號,也要轉換為雙引號。
```javascript
let arr=["先思考后編碼",'分享互助',3];
console.log(JSON.stringify(arr));
```
類似,數組中的數據,如果原本是字符串,一定要采用雙引號包裹。
**具有兩個參數的情況:**
JSON.stringify()第二個參數可以是兩種形式,一種是函數,第二種是數組,下面分別做一下介紹。
**1.當是函數的情況:**
具有兩個參數,分別是對象屬性和屬性值,或者數組索引和數組值。
它的返回值對于value參數的序列化結果有直接的影響。
(1).如果返回值是undefined,那么value參數序列化的結果為 undefined 或者當前遞歸序列化對象的屬性被刪除。
(2).如果返回值是一個對象,那么該對象會被遞歸序列化。
```javascript
let arr=["先思考后編碼","antzone",5];
function done(key,value){
}
let jsonStr=JSON.stringify(arr,done);
console.log(jsonStr);
```
上面的代碼中,數組被序列化后的結果為undefined,因為第二個參數函數的返回值是undefined。
```javascript
let obj={
webName:"antzone",
age:2,
target:"分享互助",
team:{
a:"jquery專區",
b:"css專區"
}
}
function done(key,value){
if(value=="antzone"){
return undefined;
}
else{
return value;
}
}
let jsonStr=JSON.stringify(obj,done);
console.log(jsonStr);
```
屬性值為"antzone",對應屬性就會被刪除,如果此函數返回的值是對象的話,會將此返回的對象遞歸序列化。
**2.當是數組的時候:**
(1).如果value參數是數組,那么第二個參數數組不起任何作用。
如果對象屬性名稱在數組元素中存在,那么此屬性將會被保留,否則會被刪除。
```javascript
let one=["先思考后編碼","antzone","分享互助",3];
let two=["antzone",3];
let jsonStr=JSON.stringify(one,two);
console.log(jsonStr);
```
第二個數組參數不會起到任何作用。
```javascript
let obj={
antzone:"先思考后編碼",
target:"分享互助",
age:3
}
let arr=["antzone",3];
let jsonStr=JSON.stringify(obj,arr);
console.log(jsonStr);
```
第二個參數數組會對對象屬性進行過濾,如果對象屬性名稱在數組中存在,那么就會保留,否則刪除。
**具有三個參數的情況:**
可以向返回值JSON文本添加縮進,具體規則如下:
(1).如果聲明此參數,則將生成返回值文本,而沒有任何額外空白。
(2).如果是數字,則返回值文本在每個級別縮進指定數目空格,如果space大于10,則縮進10個空格。
(3).如果是一些轉義字符,比如“\t”,表示回車,那么它每行一個回車。
(4).如果是非空字符串,則返回值文本在每個級別字符串前面附加上返回的字符串即可。
(5).如果是長度大于10個字符的字符串,則使用前10個字符。
(6).由于這個比較簡單,就不給出代碼了,通常情況下,第三個參數都是省略的。
**undefined、function和Symbol處理:**
在文章的開頭部分已經提到過,JSON數據不支持上述三種類型數據。
但是在不同的上下文中,JSON.stringify() 方法對它們的處理方式不同。
直接通過JSON.stringify() 方法轉換三種數據,方法的返回值是undefined,也可以認為被轉換為了undefined。
如果上述三種類型的值作為對象屬性,那么會直接被忽略,代碼如下:
```javascript
let antzone={
webName:"先思考后編碼",
age:undefined,
func:function(){},
sy:Symbol("前端教程")
}
console.log(JSON.stringify(antzone));
```
可以看到值為上述三種類型的屬性直接被無視了。
如果上述三種類型的值作為數組成員,那么會被轉換為null,代碼如下:
```javascript
let arr=["先思考后編碼",undefined,function(){},Symbol("前端教程")];
console.log(JSON.stringify(arr));
```
可以看到三種類型的數據,在數組中被轉換成了null。
總結
以上是生活随笔為你收集整理的java json.stringify_JSON.stringify() 方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Axure RP 9安装与使用
- 下一篇: unity中如何解决镜头穿透模型?