成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript JSON——“語法、解析與序列化”的注意要點

?。?。 / 1253人閱讀

摘要:對象對象作為一種復雜的數(shù)據(jù)類型,表示的是一組有序的鍵值對。解析與序列化對象流行的最主要的原因是因為數(shù)據(jù)結(jié)構(gòu)可以解析為的對象。為了改變序列化對象的結(jié)果,函數(shù)返回值就是相應(yīng)鍵的值。否則按照默認順序執(zhí)行序列化。

語法

JSON可以表示一下三種類型的值:

簡單值:使用與js相同的語法可以在json中表示字符串、數(shù)值、布爾值和null。但是json不支持js的undefined。

對象:對象作為一種復雜的數(shù)據(jù)類型,表示的是一組有序的鍵值對。每個鍵值對的值可以是簡單值,也可以是復雜數(shù)據(jù)類型的值

數(shù)組:數(shù)組也是一種復雜數(shù)據(jù)類型,表示一組有有序的的值列表,可以通過數(shù)值索引來訪問其中的值。數(shù)組的值也可以是任意類型,簡單值,對象,數(shù)組均可。

json不支持變量,函數(shù),對象實例,它就是一種表示結(jié)構(gòu)化數(shù)據(jù)的格式。

簡單值

js字符串與json最大的區(qū)別在于json字符串必須使用雙引號,單引號會導致語法錯誤。

對象

js中的對象:

var person = {
    name: "oliver",
    age:29
};

但在JSON中屬性需要加上雙引號

{
    "name": "oliver",
    "age": 29
}

并且沒有聲明變量;沒有末尾的分號。絕對不能在同一個對象中出現(xiàn)兩個同名屬性。

數(shù)組

js中的數(shù)組:

var values = [321,"Oliver",false]

JSON中的數(shù)組:

[321,"Oliver",false]

JSON中沒有變量和分號。

解析與序列化 JSON對象

json流行的最主要的原因是因為json數(shù)據(jù)結(jié)構(gòu)可以解析為js的對象。早期的json解析器基本上是使用js的eval()函數(shù)。對于較早版本的瀏覽器,可以使用一個shim:https://github.com/douglacrockford/JSON-js。對于那些不能原生支持JSON解析的瀏覽器,使用shim是最佳選擇。ECMAScript 5對解析JSON的行為進行了規(guī)范,定義了全局對象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對象外,還可以接收另外兩個參數(shù),這兩個參數(shù)用于指定以不同方式序列化javascript對象。

第一個參數(shù)是一個過濾器,可以是一個數(shù)組,也可以是一個函數(shù)。

第二個參數(shù)是一個選項,表示是否在JSON字符串中保留縮進。多帶帶或組合使用這兩個參數(shù),可以全面化的控制JSON序列化。

過濾結(jié)果

JSON.stringify()的第二個參數(shù)是一個數(shù)組。在返回結(jié)果中,只會包含這些屬性。

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"]}

如果第二個參數(shù)是函數(shù),傳入的函數(shù)接收兩個參數(shù),屬性名屬性值(function (key,value))。

根據(jù)屬性名可以知道應(yīng)該如何處理序列化的對象中的屬性。屬性名只能是字符串,而在值并非鍵值對結(jié)構(gòu)的值時,鍵名可以是空字符串。為了改變序列化對象的結(jié)果,函數(shù)返回值就是相應(yīng)鍵的值。如果返回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()的第三個參數(shù)是用于控制結(jié)果中的縮進和空白符。如果這個參數(shù)是一個數(shù)值,表示是每個級別縮進的空格數(shù)。

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
// }

最大的縮進空格數(shù)是10,超過10,則設(shè)定為10.

如果縮進字符串是一個字符串而非數(shù)值,則在這個字符串將在JSON字符串中被用作縮進字符??s進字符串最多也只出現(xiàn)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()方法,為任何對象添加,它會在對象被序列化是調(diào)用,返回指定的數(shù)據(jù),而不是整個對象的序列化數(shù)據(jù)。

toJSON()方法可以作為函數(shù)過濾器的補充,因此理解序列化內(nèi)部順序十分重要。假設(shè)把一個對象傳入JSON.stringify(),序列化該對象的順序如下:

如果存在toJSON()方法而且能通過它取得有效地值,則調(diào)用該方法。否則按照默認順序執(zhí)行序列化。

如果提供了第二個參數(shù),應(yīng)用這個函數(shù)過濾器。傳入函數(shù)過濾器的值是第一步的返回值。

對第2步返回的每個值進行相應(yīng)的序列化

如果提供了第三個參數(shù),執(zhí)行相應(yīng)的格式化

如:

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()方法也可以接收另一個參數(shù),該參數(shù)是一個函數(shù),將在每個鍵值對上調(diào)用。

這個函數(shù)被稱為還原函數(shù),它與JSON.stringify()方法中的過濾函數(shù)有些相似,都接收鍵值對,返回一個值。如果還原函數(shù)返回undefined,則表示要從結(jié)果中刪除相應(yīng)的鍵,如果返回其他值,則將改值插入到結(jié)果中。

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;
    }
})

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78745.html

相關(guān)文章

  • JavaScript AjaxComet——“其他跨域技術(shù)”注意要點

    摘要:由兩部分組成回調(diào)函數(shù)和數(shù)據(jù)。回調(diào)函數(shù)是當響應(yīng)到來時應(yīng)該在頁面中調(diào)用的函數(shù),回調(diào)函數(shù)的名字一般是在請求中指定的。下面是以個的例子回調(diào)函數(shù)的名字就是是通過動態(tài)的元素來使用的,使用時可以為屬性指定一個跨域。是為與其他傳遞消息的很相似。 圖像Ping技術(shù) 根據(jù)一個網(wǎng)頁可以從任何網(wǎng)頁中加載圖像而不用擔心使用跨域的原理, 我們可以動態(tài)的創(chuàng)建圖像, 使用他們的onload和onerror事件處理程序...

    Hwg 評論0 收藏0
  • JavaScript HTML5腳本編程——“跨文檔消息傳遞”注意要點

    摘要:跨文檔消息傳送,有時候也簡稱為,指的是來自不同域的頁面間傳遞消息。接收到消息時,會觸發(fā)對象的事件。接受到消息后驗證發(fā)送窗口的來源是至關(guān)重要的?;镜臋z測模式如下。 跨文檔消息傳送(cross-document messaging),有時候也簡稱為XDM,指的是來自不同域的頁面間傳遞消息。例如,www.wrox.com域中的一個頁面與一個位于內(nèi)嵌框架中的p2p.wrox.com域中的頁面...

    TerryCai 評論0 收藏0
  • JavaScript 高級技巧——“高級函數(shù)”注意要點

    摘要:語法如下注意這里使用的并不是的,是內(nèi)部函數(shù)的。函數(shù)柯里化的基本方法是使用一個閉包返回一個函數(shù)。當函數(shù)被調(diào)用時,返回的函數(shù)還需要設(shè)置一些傳入的參數(shù)。 安全的類型檢測 typeof操作符 檢測數(shù)據(jù)類型的結(jié)果可能會不正確; instanceof操作符 操作符在多個全局作用域下存在問題: var value = []; var isArray = value instanceof Array;...

    solocoder 評論0 收藏0
  • 詳解JavaScript中l(wèi)ocalStorage使用要點

    摘要:提供了幾個方法存儲如果存在時,更新獲取如果不存在返回刪除一旦刪除,對應(yīng)的數(shù)據(jù)將會全部刪除全部清除某些時候使用逐個刪除太麻煩,可以使用執(zhí)行的后果是會清除所有對象保存的數(shù)據(jù)遍歷存儲的數(shù)據(jù)總量,例獲取,例存儲格式數(shù)據(jù)將一個對象轉(zhuǎn)換成格式的數(shù)據(jù)串返 localStorage提供了幾個方法: 1、存儲:localStorage.setItem(key,value) 如果key存在時,更新valu...

    taowen 評論0 收藏0
  • JavaScript 4 種數(shù)組遍歷方法: for VS forEach() VS for/in

    摘要:對于,除非使用箭頭函數(shù),它的回調(diào)函數(shù)的將會變化。使用測試下面的代碼,結(jié)果如下打印打印要點使用的規(guī)則要求所有回調(diào)函數(shù)必須使用箭頭函數(shù)。 譯者按: JS 騷操作。 原文:For vs forEach() vs for/in vs for/of in JavaScript 譯者: Fundebug 本文采用意譯,版權(quán)歸原作者所有 我們有多種方法來遍歷 JavaScript 的數(shù)組或者...

    joyqi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<