json基礎用法


JSON格式

JSON格式(JavaScript Object Notation的縮寫)是一種用於數據交換的文本格式,2001年由Douglas Crockford提出,目的是取代繁瑣笨重的XML格式。相比XML格式,JSON格式有兩個顯著的優點:書寫簡單,一目了然;符合JavaScript原生語法,可以由解釋引擎直接處理,不用另外添加解析代碼。所以,JSON迅速被接受,已經成為各大網站交換數據的標准格式,並被寫入ECMAScript 5,成為標准的一部分。簡單說,每個JSON對象,就是一個值。要么是簡單類型的值,要么是復合類型的值,但是只能是一個值,不能是兩個或更多的值。這就是說,每個JSON文檔只能包含一個值。

JSON對值的類型和格式有嚴格的規定。

 1. 復合類型的值只能是數組或對象,不能是函數、正則表達式對象、日期對象。
 2. 簡單類型的值只有四種:字符串、數值(必須以十進制表示)、布爾值和 null (不能使用 NaN , Infinity , -Infinity 和 undefined )。
 3. 字符串必須使用雙引號表示,不能使用單引號。
 4. 對象的鍵名必須放在雙引號里面。
 5. 數組或對象最后一個成員的后面,不能加逗號。

以下是合格的JSON值。合格的格式!

輸出之后:

以下是不合格的JSON值。

 

需要注意的是,空數組和空對象都是合格的JSON值, null 本身也是一個合格JSON值。

 
 
ES5 新增了 JSON 對象,用來處理 JSON 格式數據。它有兩個方 法: JSON.stringify() JSON.parse()

JSON.stringify()
基本用法
 
 
JSON.stringify 方法用於將一個值轉為字符串。該字符串應該符合 JSON 格式,並且
 
 
可以被 JSON.parse 方法還原。

 

   上面代碼將各種類型的值,轉成JSON字符串。需要注意的是,對於原始類型的字符串,轉換結果會帶雙引號,即字符串 abc 會被轉成 "abc" ,這是因為將來還原的時候,雙引號可以讓JavaScript引擎知道, abc 是一個字符串,而不是一個變量名。如果原始對象中,有一個成員的值是 undefined 、函數或XML對象,這個成員會被省略。如果數組的成員是 undefined 、函數或XML對象,則這些值被轉成 null

 

 

 上面代碼中,原始對象的 f 屬性是一個函數, JSON.stringify 方法返回的字符串會將這個屬性省略。而 a 屬性是一個數組,成員分別為函數和undefined,它們都被轉成null

正則對象會被轉成空對象。

 

 

JSON.stringify 方法會忽略對象的不可遍歷屬性。

 

 上面代碼中, bar obj 對象的不可遍歷屬性, JSON.stringify 方法會忽略這個屬性。


 

 第二個參數

JSON.stringify 方法還可以接受一個數組,作為第二個參數,指定需要轉成字符串 的屬性。

 

 上面代碼中, JSON.stringify 方法的第二個參數指定,只轉 prop1 prop2 兩個屬性。

 
 
 
這個類似 白名單 的數組,只對對象的屬性有效,對數組無效。
 
 

 

 

上面代碼中,第二個參數指定JSON格式只轉 0 號屬性,實際上對數組是無效的,只對對象有效。

 
 
第二個參數還可以是一個函數,用來更改 JSON.stringify 的默認行為。

 

 上面代碼中的 f 函數,接受兩個參數,分別是被轉換的對象的鍵名和鍵值。如果鍵值是數值,就將它乘以 2 ,否則就原樣返回。

 
 
注意,這個處理函數是遞歸處理所有的鍵。

 

 上面代碼中,對象 o 一共會被 f 函數處理三次。第一次鍵名為空,鍵值是整個對o ;第二次鍵名為 a ,鍵值是 {b: 1} ;第三次鍵名為 b ,鍵值為1

 

遞歸處理中,每一次處理的對象,都是前一次返回的值。

 

 上面代碼中, f 函數修改了對象 o ,接着 JSON.stringify 方法就遞歸處理修改后的對象 o

 

如果處理函數返回 undefined 或沒有返回值,則該屬性會被忽略。
上面代碼中, a 屬性經過處理后,返回 undefined ,於是該屬性被忽略了。
 

 


 

第三個參數JSON.stringify 還可以接受第三個參數,用於增加返回的JSON字符串的可讀性。如果是數字,表示每個屬性前面添加的空格(最多不超過10個);如果是字符串(不超過10個字符),則該字符串會添加在每行前面。

 

 


 

toJSON 方法 如果 JSON.stringify 的參數對象有自定義的 toJSON 方法,那么 JSON.stringify 會使用這個方法的返回值作為參數,而忽略原對象的其他屬性。

 

 

上面代碼是 JSON.stringify 方法處理一個正常的對象。
 
現在,為這個對象加上 toJSON 方法。

 

 上面代碼中, JSON.stringify 發現參數對象有 toJSON 方法,就直接使用這個方法的返回值作為參數,而忽略原對象的其他參數。

 
Date 對象就有一個自己的 toJSON 方法。

 

 上面代碼中, JSON.stringify 一旦發現處理的是 data 對象實例,就會自動調用這個實例對象的 toJSON 方法,將該方法的返回值作為參數。

 

  toJSON 方法的一個應用是,將正則對象自動轉為字符串。因為 JSON.stringify 認不能轉換正則對象,但是設置了 toJSON 方法以后,就可以轉換正則對象了。
 
上面代碼在正則對象的原型上面部署了 toJSON 方法,將其指向 toString 方法,因此
 
 
遇到轉換成 JSON 時,正則對象就先調用 toJSON 方法轉為字符串,然后再
 
 
JSON.stingify 方法處理。
 
JSON.parse()
 
 
JSON.parse 方法用於將 JSON 字符串轉化成對象。

 

 

  如果傳入的字符串不是有效的JSON格式, JSON.parse 方法將報錯。

 

 

 上面代碼中,雙引號字符串中是一個單引號字符串,因為單引號字符串不符合JSON

 
 
式,所以報錯。
 
為了處理解析錯誤,可以將 JSON.parse 方法放在 try...catch 代碼塊中。
JSON.parse 方法可以接受一個處理函數,用法與 JSON.stringify 方法類似。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM