1. 程式人生 > >JSON語法及解析,序列化

JSON語法及解析,序列化

一.JSON語法可以表示以下三種類型的值。

1.簡單值

     5         //json表示數值5
"hello world"  //json表示字串
javascript 字串和 json 字串的最大區別是,json 字串必須使用雙引號(單引號會導致語法錯)。
布林值和null也是有效的 json 形式,但是在實際應用中,json更多的用來表示更復雜的資料結構。

2.物件

//json表達物件
{                   
    "name":"unamattin",
    "age":"18",
    "scholl":{
        "name":"北京大學"
, "location":"北京" } }
與 javascript 的物件自變數相比,json 物件有兩個地方不一樣,首先,沒有宣告變數(json沒有變數的概念);其次,沒有末尾分號。
這個例子在頂級物件中嵌入了 school 資訊。雖然有兩個 "name" 屬性,但由於它們分別屬於不同的物件,因此完全沒有問題。不過,同一個物件中絕不應該出現兩個同名屬性。

3.陣列

//json表達陣列
[25,"hi",true]  
//同時也可以把陣列和物件結合起來,構成更復雜的資料集合
[
    {
        "title":"professional Javascript "
, "authors":[ "Nicholas C. Zakas" ], edition:3, year:2011 }, { "title":"professional Ajax", "authors":[ "Nicholas C. Zakas", "Jeremy Mcpeak", "Joe Fawcett" ], edition:2, year:2008
}, ]
同樣要注意,json 陣列也沒有變數和分號,這個陣列包含一些圖書的物件,每個物件都有幾個屬性,其中一個屬性是"authors",這個屬性的值又是一個數組,物件和陣列通常是 json 資料結構的最外層形式。
二.解析與序列化
json 之所以流行,擁有與 javascript 類似的語法並不是全部原因。更重要的一個原因是,可以把 json 資料結構解析為有用的 javascript 物件。
就以上一節包含一組圖書的 json 資料結構為例,在解析 javascript 物件後,只需要下面一行簡單的程式碼就可以取得第一本書的書名:
//這裡是假設把解析json資料結構後得到的物件儲存到變數books中
 books[0].title

//再看看下面在DOM結構中查詢資料的程式碼 
document.getElementsByTagName("book")[0].getAttribute("title")

//不難理解,為什麼json能夠得到開發人員的熱烈歡迎了。

1.JSON物件

JSON物件有兩個方法:stringify()和parse()。在最簡單的情況下,這兩個方法分別用於把 javascript 物件序列化為 json 字串和把 json 字串解析為原生 javascript 值。例如:
var book={
    title:"Javascript",
    authors:[
        "Nicholas C. Zakas"
    ],
    edition:3,
    year:2011
};
var jsonText=JSON.stringify(book);
這個例子使用 JSON.stringify() 把一個javascript物件序列化為一個 JSON 字串,然後將它儲存進變數 jsonText 中。預設情況下,輸出的 JSON 字串不包含任何空格和縮排,因此 jsonText 中的字串如下:
{"title":"Javascript","authors":["NicholasC.Zakas"],"edition":3,"year":2011}
在序列化 javascript 物件時,所有函式及原型成員都會被忽略,結果中最終都是值為 json 資料型別的例項屬性。
將 json 字串直接傳遞給 JSON.parse(jsonText) 就可以得到相應的 javascript 值。如下:
var bookCopy=JSON.parse(jsonText);
注意,雖然 book 和 bookCopy 具有相同的屬性,但他們是兩個獨立沒有任何的關係,如果傳給 JSON.parse() 不是有效的 json,該方法會報錯。

2.序列化選項

實際上,JSON.stringify() 還可以接收兩個引數,這兩個引數用於指定以不同的方式序列化 javascript 物件。
第一個引數是個過濾器,可以是個陣列也可以是個函式;第二個引數是一個選項,表示是否在 json 字串保留縮排。
var book={
    title:"Javascript",
    authors:[
        "Nicholas C. Zakas"
    ],
    edition:3,
};
var jsonText=JSON.stringify(book,["titlt""edition"]) 
//jsontext
{"title":"Javascript","edition":3} 
這裡的第二個引數是一個數組,包含兩個字串,"titlt","edition",這兩個屬性與將要序列化的物件是對應的,因此返回的 jsonText 只包含這兩個屬性。
var jsonText=JSON.stringify(book,function(){
    switch(key){
        case "authors":
            return value.join(",")
        case "year":
            return 5000;
        case "edition":
            return undefined;
        default:
            return value;
    }
});
//jsonText
{"title":"Javascript","authors":"Nicholas c. Zakas","year":5000}
這裡函式過濾器根據傳入的鍵來決定結果。
如果鍵為"authors",就將陣列連線為一個字串;
如果鍵為"year",則將其設定為5000;
如果鍵為"edition",通過返回 undefined 刪除該屬性;
最後一定要提供 default 項,返回傳入的值,以便其它的值能夠正常出現在結果中。
要序列化的物件中每一個物件都要經過過濾器,因此陣列中每個帶有這些屬性的經過過濾器之後,每個物件都包含"title","authors","year"屬性。
var jsonText=JSON.stringify(book,null,4)
//jsonText 
{
    title:"Javascript",
    authors:[
        "Nicholas C. Zakas"
    ],
    edition:3,
}

var jsonText=JSON.stringify(book,null,"--")
//jsonText 
{
--title:"Javascript",
--authors:[
----"Nicholas C. Zakas"
--],
    edition:3,
}
這裡添加了第三個引數,控制結果的縮排符和空白符,輸出的結果會自動插入了換行符提高可讀性。
如果是數值,就代表多少個空格,如果是字串,這個字串就會被當做縮排符來使用,縮排字元最多十個。