---------- 2018-05-16 JSON 格式: ref: https://smalljacky.com/uncategorized/json-format-and-javascript/ http://json.org/index.html http://json.org/json-zh.html 什麼是 JSON JSON (JavaScript Object Notation,JavaScript 物件表示法)。 一種以純文字為基礎,來儲存和交換簡單結構的輕量級「資料交換格式」(類似 XML)。 獨立於語言。 具有自我描述性,更易於人理解、閱讀和編寫,同時也易於機器解析和生成。 JSON 比 XML(eXtensible Markup Language,可延伸標記式語言)更小、更快且更易解析。 應用領域 JSON 最開始被廣泛的應用於 Web 的開發,隨著 Web 2.0 的方興未艾,JSON 在 Web 資料傳輸領域占有重要的地位。 JSON 因小巧與瀏覽器內建快速解析支援,因此較適用於網路資料傳輸領域,而目前最常用在 AJAX (Asynchronous JavaScript and XML,非同步的 JavaScript 與 XML 技術) 的資料傳輸。 JSON 與 XML 比較 JSON 與 XML 最大的不同在於 XML 是一個完整的標記語言,而 JSON 不是。這使得 XML 在程式判讀上需要比較多的功夫。主要的原因在於 XML 的設計理念與 JSON 不同。XML 利用標記語言的特性提供了絕佳的延展性(如 XPath),在資料儲存,擴充功能及高階檢索方面具備對 JSON 的優勢,而 JSON 則由於比 XML 更加小巧,以及瀏覽器的內建快速解析支援,使得其更適用於網路資料傳輸領域。 ---------- JSON 格式 字串 JSON 字串可以包含物件(Object)或陣列(Array)資料。 物件(Object)與陣列(Array)可互相包含,例如 {"array": [{"object": "object"}]} 物件 一個物件以 { 開始,並以 } 結束,來寫入資料。 name 為字串,必須以 "" 括起來。 name 與 value 之間使用 : 分隔。 多個 name:value 之間使用 , 分隔。 {"name": value, "name": value} 陣列 一個陣列以 [ 開始,並以 ] 結束,來寫入資料。 多個 value 之間使用 , 分隔。 [value, value] 物件和陣列值 物件(Object):{}。 陣列(Array):[]。 字串(String):以 "" 括起來。 數值(number):0-9 的數字組合(整數、小數或負數)。 布林(boolean):true 或 false。 空值(Null):null。 {"array": ["string", 10, 1.0, -1, true, false, null]} ---------- JSON 字串範例 例如一個會員的基本資料,使用 JSON 字串表示如下: { "number": "1020501", "name": "小傑", "age": 32, "sex": "M", "interest": [ "網頁設計", "撰寫文章" ] } ---------- JavaScript 處理 JSON 物件序列化成 JSON 字串 JSON.stringify() 可以將 JavaScript 物件序列化成 JSON 字串: // JavaScript 物件 var member = { "number": "1020501", "name": "小傑", "age": 32, "sex": "M", "interest": [ "網頁設計", "撰寫文章" ] }; console.log( JSON.stringify(member) // 序列化成 JSON 字串 ); /* 輸出: "number":"1020501","name":"小傑","age":32,"sex":"M","interest":["網頁設計","撰寫文章"]} */ JSON.stringify() 方法可指定第二個參數: 如果該參數是一個 function(可接受物件的特性與值,可以自行決定如何轉換為 JSON 字串),則在序列化過程中,被序列化的值的每個屬性都會經過 function 的轉換和處理,return 值為 number、string、boolean,就會被加入 JSON 字串;為 object,則會遞迴呼叫指定的 function 進行轉換;若為 undefined,該特性就不會被加入 JSON 字串。 如果該參數是一個 array,則只有包含在這個 array 中的屬性名才會被序列為 JSON 字串。 // JavaScript 物件 var member = { "number": "1020501", "name": "小傑", "age": 32, "sex": "M", "interest": [ "網頁設計", "撰寫文章" ] }; // 使用第二個參數 function 方式,排除 age 特性不被序列為 JSON 字串 console.log( JSON.stringify(member, function(key, value) { if (key === "age") return undefined; return value; }) ); /* 輸出: {"number":"1020501","name":"小傑","sex":"M","interest":["網頁設計","撰寫文章"]} */ // 使用第二個參數 array 方式,指定要被序列為 JSON 字串的特性 console.log( JSON.stringify(member, ["number", "name"]) ); /* 輸出: {"number":"1020501","name":"小傑"} */ JSON.stringify() 方法可指定第三個參數,來控制結果字串的縮排間距,並會自動換行: 如果是一個數值,則在字串化時每一級別會比上一級別多縮排該數值的空格(最多 10 個空格)。 如果是一個字串(如 \t、""),則每一級別會比上一級別多縮排該字串的空格。 // JavaScript 物件 var member = { "number": "1020501", "name": "小傑", "age": 32, "sex": "M", "interest": [ "網頁設計", "撰寫文章" ] }; // 使用第三個參數「數值」方式,指定縮排 console.log( JSON.stringify(member, null, 2) ); /* 輸出: { "number": "1020501", "name": "小傑", "age": 32, "sex": "M", "interest": [ "網頁設計", "撰寫文章" ] } */ // 使用第三個參數「字串」方式,指定縮排 console.log( JSON.stringify(member, null, "\t") ); /* 輸出: { "number": "1020501", "name": "小傑", "age": 32, "sex": "M", "interest": [ "網頁設計", "撰寫文章" ] } */ JSON 字串解析成 JavaScript 物件 JSON.parse() 方法 JSON.parse() 方法可以將 JSON 字串解析成 JavaScript 物件,這樣就可使用 JavaScript 進行操作了: // 宣告字串須使用 '' 括起來,否則就會變成是 JavaScript 物件(Object)了 // 如在不同行必須在每行結尾處加上 \,否則會產生 SyntaxError var jsonString = '{ \ "number": "1020501", \ "name": "小傑", \ "age": 32, \ "sex": "M", \ "interest": [ \ "網頁設計", \ "撰寫文章" \ ] \ }'; // 將 JSON 字串解析成 JavaScript 值,這樣就可使用 JavaScript 進行操作了 var member = JSON.parse(jsonString); // 取得物件的指定值 console.log( member.name + ', ' + member.interest[0] ); /* 輸出: 小傑, 網頁設計 */ JSON.parse() 方法可指定第二個參數 function 用來轉換解析出的屬性值,return 的值決定最後在物件上的特性值;若 return 的值為 undefined,就不會包括該特性: 一些較舊的瀏覽器內建如果沒有支援 JSON 方法,可至 JSON (官方網站) 點擊 JSON2.js 下載後,載入至文件使用,以獲得 JSON 支援 http://json.org/index.html // 宣告字串須使用 '' 括起來,否則就會變成是 JavaScript 物件(Object)了 // 如在不同行必須在每行結尾處加上 \,否則會產生 SyntaxError var jsonString = '{ \ "number": "1020501", \ "name": "小傑", \ "age": 32, \ "sex": "M", \ "interest": [ \ "網頁設計", \ "撰寫文章" \ ] \ }'; // 使用第二個參數 function 方式,排除 age 特性不被包括在物件 var member = JSON.parse(jsonString, function(key, value) { if (key === "age") return undefined; return value; }); // 取得物件 console.log( member ); /* 輸出: Object {number: "1020501", name: "小傑", sex: "M", interest: ["網頁設計", "撰寫文章"]} */ eval() 函式 eval() 函式可以將一個 JavaScript 代碼字串求值成特定的物件。字串前後須加上刮號 eval("(" + string + ")"),用來告知 Javascript 這是個物件描述,而不是要執行的 statement: eval() 函式可執行字串中的 Javascript 程式碼,所以容易有 XSS 攻擊的危險,因此較不建議使用 可相容較舊版本的瀏覽器 // 宣告字串須使用 '' 括起來,否則就會變成是 JavaScript 物件(Object)了 // 如在不同行必須在每行結尾處加上 \ 告知這是接續下一行,否則會產生 SyntaxError var jsonString = '{ \ "number": "1020501", \ "name": "小傑", \ "age": 32, \ "sex": "M", \ "interest": [ \ "網頁設計", \ "撰寫文章" \ ] \ }'; // 使用 eval() 將字串求值成特定的物件(字串前後須加上刮號,用來告知這不是要執行的 statement),這樣就可使用 JavaScript 進行操作了 var member = eval("(" + jsonString + ")"); // 取得物件的指定值 console.log( member.name + ', ' + member.interest[0] ); /* 輸出: 小傑, 網頁設計 */ ----------- 走訪 (遍歷) JavaScript 物件、陣列 個別使用 JavaScript for() 與 jQuery each() 兩種方式,在走訪(遍歷)時,將資料帶入表格(table)。 使用 JavaScript for() HTML
姓名 年齡
JavaScript var json = [{"name": "小傑", "age": 32}, {"name": "小明", "age": 28}]; var forTable = document.querySelector( ".for-table tbody" ); var jsonSum = json.length; for (var i = 0; i < jsonSum; i++) { forTable.innerHTML += "" + "" + json[i].name + "" + "" + json[i].age + "" + ""; } 結果: 姓名 年齡 小傑 32 小明 28 使用 jQuery each() 此範例必須先載入 jQuery HTML
姓名 年齡
JavaScript var json = [{"name": "小傑", "age": 32}, {"name": "小明", "age": 28}]; var eachTable = $(".each-table tbody"); $.each(json, function(index, element) { eachTable.append( "" + "" + element.name + "" + "" + element.age + "" + ""); }); 結果: 姓名 年齡 小傑 32 小明 28