JSON學習筆記

JSON學習筆記

目錄編程

簡述

  JSON(JavaScript Object Notation)是一種能夠被不少語言使用的數據格式,本質上是一個字符串,可是它有本身的語法,這樣它就能夠被 解析器 轉換爲編程語言中的元素——簡單值、對象、數組。 反過來,編程語言中的元素也能夠被 序列化器 轉換爲 JSON 字符串。

  不少編程語言都有針對 JSON 的解析器和序列化器,好比後臺 PHP 把一個 PHP 對象 序列化 爲一段 JSON 字符串,傳遞給前臺頁面的 JavaScript 腳本,而後 JavaScript 將其 解析 爲一個 JavaScript 對象。

  下文將解答兩個問題:

  1. 語法:JSON能夠表示哪些數據?

  2. 解析與序列化:JSON字符串與 JavaScript 數據如何互相轉換?

 

1、語法

JSON做爲數據橋樑,能夠表示簡單值、對象、數組。

 

1.1 簡單值

  • 字符串:"hello world"

  • 數值:10086

  • 布爾值:true

  • null:null

 

1.2 對象

  JSON 要求給對象屬性加上雙引號,並且 JSON對象沒有名字,末尾沒有分號,由於這不是JavaScript語句:

//這是一個JSON對象
{
    "name": "Paykan",
    "age": 27
}

 

1.3 數組

  JSON數組和JavaScript數組同樣: [25, "Paykan"],可是沒有名字。能夠把JSON數組和JSON對象組合起來:

//這是一個JSON數組
[
    {
        "name": "Paykan",
        "age": 27,
        "skill": ["HTML", "CSS", "JavaScript"]
    },
    {
        "name": "BarneyRoos",
        "age": 26,
        "skill": ["JSON", "Ajax", "Vue"]
    }
]

 

2、解析與序列化

正由於能夠把 JSON 字符串解析爲有用的 JavaScript 對象、數組等,因此 JSON 已是 Web 開發中數據交換的事實標準。

JavaScript 簡單值和數組是不須要序列化的。JSON 簡單值和數組也不須要解析便可在 JavaScript 中使用。

 

2.1 JSON對象

JavaScript 中有個 JSON 對象,專門用來處理 JSON 數據。JSON 對象有兩個方法:
  • 序列化器:stringify(),用於把 JavaScript 值轉換爲 JSON 字符串

  • 解析器:parse(),用於把 JSON 字符串解析爲 JavaScript 值

//序列化器的使用
//先定義一個JavaScript對象
var book = {
    title: "Professional JavaScript",
    authors: ["Nicholas"],
    edition: 3,
    year: 2011
    say: function(){
        return this.title;
    }
}
​
//開始序列化
var jsonText = JSON.stringify(book); 
//"{"title":"Professional JavaScript","authors":["Nicholas"],"edition":3,"year":2011}"
//注意,內層的雙引號確定是通過轉義了的
//開始解析
var newBook = JSON.parse(jsonText); 
//{title: "Professional JavaScript", authors: Array(1), edition: 3, year: 2011}

  在序列化 JavaScript 對象的時候,函數和原型對象成員會被忽略,值爲 undefined 的屬性也會被忽略。

 

2.2 序列化選項

stringify() 函數能夠接收另外兩個參數來控制序列化工做:過濾器、縮進選項

 

2.2.1 過濾器

  過濾器用來指定工做方式,你可讓 stringify() 函數只轉換特定的幾個屬性、能夠規定碰見某個屬性的時候作點什麼事情,因此過濾器有兩種:

  1. 數組:用來讓 stringify() 函數只轉換特定的幾個屬性

//只轉換上文中 book 對象的title和edition屬性
var jsonText = JSON.stringify(book, ["title", "edition"]);
//"{"title":"Professional JavaScript","edition":3}"
  1. 函數:用來規定碰見某個屬性的時候作點什麼事情

//當碰見title屬性時,加上字符串 "3rd edition"
//當碰見edition屬性時,轉換爲undefined————不出如今JSON字符串中
var jsonText = JSON.stringify(book, function(key, value){
    switch(key){
        case "title": return value + "3rd edition"; 
        case "edition": return undefined;
        default: return value;//注意:不須要處理的屬性,必定要顯式地返回其值
    }
});
//"{"title":"Professional JavaScript3rd edition","authors":["Nicholas"],"year":2011}"

 

2.2.2 縮進選項

  在序列化 JavaScript 對象時,還能夠保留源代碼中的換行和縮進——只須要用一個整數指定縮進幾個空格便可:

//第二個參數若是不須要設置,就必須爲null
var jsonText = JSON.stringify(book, null, 4);
/*
    "{
        "title": "Professional JavaScript",
        "authors": [
            "Nicholas"
        ],
        "edition": 3,
        "year": 2011
    }"
*/

 

2.3 解析選項

  和序列化選項同樣,在進行 JSON 對象解析時,也能夠加上另外的參數來控制函數的工做。parse() 函數接收的第二個參數是一個函數,將在每一個屬性上調用:

//如今把上文的jsonText解析成JavaScript對象,解析過程當中加一點控制
var newBook = JSON.parse(jsonText, function(key, value){
    if(key === "edition") {
        return value + "rd";
    }
    else{
        return value;   //注意:不須要處理的屬性,必定要顯式地返回其值,須要刪除的屬性,返回undefined
    }
});

 

小結

  JSON能夠表示三種類型的數據:

  • 簡單值:不能表示 undefined,不須要序列化和解析

  • 數組:和 JavaScript 數組同樣,不須要序列化和解析

  • 對象:屬性名須要加雙括號

   JavaScript 對象序列化時能夠用過濾器和縮進選項來控制序列化工做。

  解析 JSON 對象時能夠用解析函數來控制解析工做。

相關文章
相關標籤/搜索