摘要:對象對象作為一種復雜的數據類型,表示的是一組有序的鍵值對。解析與序列化對象流行的最主要的原因是因為數據結構可以解析為的對象。為了改變序列化對象的結果,函數返回值就是相應鍵的值。否則按照默認順序執行序列化。
語法
JSON可以表示一下三種類型的值:
簡單值:使用與js相同的語法可以在json中表示字符串、數值、布爾值和null。但是json不支持js的undefined。
對象:對象作為一種復雜的數據類型,表示的是一組有序的鍵值對。每個鍵值對的值可以是簡單值,也可以是復雜數據類型的值
數組:數組也是一種復雜數據類型,表示一組有有序的的值列表,可以通過數值索引來訪問其中的值。數組的值也可以是任意類型,簡單值,對象,數組均可。
json不支持變量,函數,對象實例,它就是一種表示結構化數據的格式。
簡單值js字符串與json最大的區別在于json字符串必須使用雙引號,單引號會導致語法錯誤。
對象js中的對象:
var person = { name: "oliver", age:29 };
但在JSON中屬性需要加上雙引號:
{ "name": "oliver", "age": 29 }
并且沒有聲明變量;沒有末尾的分號。絕對不能在同一個對象中出現兩個同名屬性。
數組js中的數組:
var values = [321,"Oliver",false]
JSON中的數組:
[321,"Oliver",false]
JSON中沒有變量和分號。
解析與序列化 JSON對象json流行的最主要的原因是因為json數據結構可以解析為js的對象。早期的json解析器基本上是使用js的eval()函數。對于較早版本的瀏覽器,可以使用一個shim:https://github.com/douglacrockford/JSON-js。對于那些不能原生支持JSON解析的瀏覽器,使用shim是最佳選擇。ECMAScript 5對解析JSON的行為進行了規范,定義了全局對象JSON。
JSON對象有兩個方法:
stringify()
parse()
在最簡單的情況下,這兩個方法分別用于把javascript對象序列化為JSON字符串和把JSON字符串解析為原聲的javascript值。
如(JSON.stringify()):
var book = { title: "javascript", authors: ["oliver", "troy"], edition: 2, year: 2000, other: undefined //被忽略 }; var jsontext = JSON.stringify(book); console.log(jsontext); //{"title":"javascript","authors":["oliver","troy"],"edition":2,"year":2000}
又如(JSON.parse()):
var anotherBook = JSON.parse(jsontext); console.log(Object.keys(anotherBook).toString()); //title,authors,edition,year序列化選項
JSON.stringify()除了要序列化的Javascript對象外,還可以接收另外兩個參數,這兩個參數用于指定以不同方式序列化javascript對象。
第一個參數是一個過濾器,可以是一個數組,也可以是一個函數。
第二個參數是一個選項,表示是否在JSON字符串中保留縮進。多帶帶或組合使用這兩個參數,可以全面化的控制JSON序列化。
過濾結果當JSON.stringify()的第二個參數是一個數組。在返回結果中,只會包含這些屬性。
var book = { title: "javascript", authors: ["oliver", "troy"], edition: 2, year: 2000, other: undefined //被忽略 }; var jsontext = JSON.stringify(book,["title","authors"]); console.log(jsontext); //{"title":"javascript","authors":["oliver","troy"]}
如果第二個參數是函數,傳入的函數接收兩個參數,屬性名和屬性值(function (key,value))。
根據屬性名可以知道應該如何處理序列化的對象中的屬性。屬性名只能是字符串,而在值并非鍵值對結構的值時,鍵名可以是空字符串。為了改變序列化對象的結果,函數返回值就是相應鍵的值。如果返回undefined作為屬性值,則表示跳過這個屬性。
如:
var book = { title: "javascript", authors: ["oliver", "troy"], edition: 2, year: 2000, other: undefined //被忽略 }; var jsontext = JSON.stringify(book,function (key,value) { switch (key) { case "authors": return value.join("-"); break; case "edition": return undefined; break; default: return value; } }); console.log(jsontext); //{"title":"javascript","authors":"oliver-troy","year":2000}字符串縮進
當JSON.stringify()的第三個參數是用于控制結果中的縮進和空白符。如果這個參數是一個數值,表示是每個級別縮進的空格數。
var book = { title: "javascript", authors: ["oliver", "troy"], edition: 2, year: 2000, other: undefined //被忽略 }; var jsonText = JSON.stringify(book,null,4); var pre = document.getElementById("pre"); pre.innerHTML = jsonText; // { // "title": "javascript", // "authors": [ // "oliver", // "troy" // ], // "edition": 2, // "year": 2000 // }
最大的縮進空格數是10,超過10,則設定為10.
如果縮進字符串是一個字符串而非數值,則在這個字符串將在JSON字符串中被用作縮進字符??s進字符串最多也只出現10個字符長度。
var book = { title: "javascript", authors: ["oliver", "troy"], edition: 2, year: 2000, other: undefined //被忽略 }; var jsonText = JSON.stringify(book,null,"----"); var pre = document.getElementById("pre"); pre.innerHTML = jsonText; // { // ----"title": "javascript", // ----"authors": [ // --------"oliver", // --------"troy" // ----], // ----"edition": 2, // ----"year": 2000 // }toJSON()方法
toJSON()方法,為任何對象添加,它會在對象被序列化是調用,返回指定的數據,而不是整個對象的序列化數據。
toJSON()方法可以作為函數過濾器的補充,因此理解序列化內部順序十分重要。假設把一個對象傳入JSON.stringify(),序列化該對象的順序如下:
如果存在toJSON()方法而且能通過它取得有效地值,則調用該方法。否則按照默認順序執行序列化。
如果提供了第二個參數,應用這個函數過濾器。傳入函數過濾器的值是第一步的返回值。
對第2步返回的每個值進行相應的序列化
如果提供了第三個參數,執行相應的格式化
如:
var book = { title: "javascript", authors: ["oliver", "troy"], edition: 2, year: 2000, toJSON: function () { return this.title + this.edition; //javascript2 }, other: undefined //被忽略 }; var jsonText = JSON.stringify(book); console.log(jsonText); //javascript2解析選項
JSON.parse()方法也可以接收另一個參數,該參數是一個函數,將在每個鍵值對上調用。
這個函數被稱為還原函數,它與JSON.stringify()方法中的過濾函數有些相似,都接收鍵值對,返回一個值。如果還原函數返回undefined,則表示要從結果中刪除相應的鍵,如果返回其他值,則將改值插入到結果中。
var book = { title: "javascript", authors: ["oliver", "troy"], edition: 2, year: 2000, date: new Date(2001, 1, 1), other: undefined //被忽略 }; var jsonText = JSON.stringify(book); console.log(jsonText); //{"title":"javascript","authors":["oliver","troy"],"edition":2,"year":2000,"date":"2001-01-31T16:00:00.000Z"} var anotherbook = JSON.parse(jsonText, function(key, value) { switch (key) { case "date": return new Date(value); break; default: return value; break; } })
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78745.html
摘要:由兩部分組成回調函數和數據?;卣{函數是當響應到來時應該在頁面中調用的函數,回調函數的名字一般是在請求中指定的。下面是以個的例子回調函數的名字就是是通過動態的元素來使用的,使用時可以為屬性指定一個跨域。是為與其他傳遞消息的很相似。 圖像Ping技術 根據一個網頁可以從任何網頁中加載圖像而不用擔心使用跨域的原理, 我們可以動態的創建圖像, 使用他們的onload和onerror事件處理程序...
摘要:跨文檔消息傳送,有時候也簡稱為,指的是來自不同域的頁面間傳遞消息。接收到消息時,會觸發對象的事件。接受到消息后驗證發送窗口的來源是至關重要的?;镜臋z測模式如下。 跨文檔消息傳送(cross-document messaging),有時候也簡稱為XDM,指的是來自不同域的頁面間傳遞消息。例如,www.wrox.com域中的一個頁面與一個位于內嵌框架中的p2p.wrox.com域中的頁面...
摘要:語法如下注意這里使用的并不是的,是內部函數的。函數柯里化的基本方法是使用一個閉包返回一個函數。當函數被調用時,返回的函數還需要設置一些傳入的參數。 安全的類型檢測 typeof操作符 檢測數據類型的結果可能會不正確; instanceof操作符 操作符在多個全局作用域下存在問題: var value = []; var isArray = value instanceof Array;...
摘要:提供了幾個方法存儲如果存在時,更新獲取如果不存在返回刪除一旦刪除,對應的數據將會全部刪除全部清除某些時候使用逐個刪除太麻煩,可以使用執行的后果是會清除所有對象保存的數據遍歷存儲的數據總量,例獲取,例存儲格式數據將一個對象轉換成格式的數據串返 localStorage提供了幾個方法: 1、存儲:localStorage.setItem(key,value) 如果key存在時,更新valu...
摘要:對于,除非使用箭頭函數,它的回調函數的將會變化。使用測試下面的代碼,結果如下打印打印要點使用的規則要求所有回調函數必須使用箭頭函數。 譯者按: JS 騷操作。 原文:For vs forEach() vs for/in vs for/of in JavaScript 譯者: Fundebug 本文采用意譯,版權歸原作者所有 我們有多種方法來遍歷 JavaScript 的數組或者...
閱讀 2805·2023-04-26 01:00
閱讀 745·2021-10-11 10:59
閱讀 2973·2019-08-30 11:18
閱讀 2666·2019-08-29 11:18
閱讀 1017·2019-08-28 18:28
閱讀 3009·2019-08-26 18:36
閱讀 2131·2019-08-23 18:16
閱讀 1065·2019-08-23 15:56