讀書筆記(01) - JSON - JavaScript高級程序設(shè)計

coding

JSON與JavaScript對象

JSON是一種表示結(jié)構(gòu)化數(shù)據(jù)的存儲格式,語法格式上與JavasScript對象有些類似颜矿。

TIPS: 與JavaScript對象的格式區(qū)別

  1. 不支持變量寄猩、函數(shù)或?qū)ο髮嵗?/li>
  2. 字符串,屬性名必須使用雙引號
  3. 無需定義變量存儲引用
// JSON對象
{
    "name": "KenTsang",
    "age": 27,
    "job": "Developer"
}

// js對象(該對象將作在后續(xù)例子引用)
let person = {
    name: 'KenTsang',
    age: 27,
    job: 'Developer'
}

ES5定義了一個全局對象JSON骑疆,IE8+以上支持田篇,該對象提供來stringifyparse兩個方法用于JSON數(shù)據(jù)解析和序列化。

stringify()

stringify用于把JavaScript對象序列化JSON字符串箍铭,

在序列化JavaScript對象時泊柬,所有函數(shù)及原型成員都會被有意忽略,不體現(xiàn)在結(jié)果中诈火。此外兽赁,值為undefined的任何屬性也都會被跳過。

JSON.stringify(
    value: Object, 
    replace: Array | function(key,value) {},
    space: number | string
)

該方法接受三個參數(shù)

  1. 參數(shù):接收傳入的js對象
  2. 參數(shù):過濾器(數(shù)組/函數(shù))
  3. 參數(shù):字符串縮進(jìn)(數(shù)值/字符串)

參數(shù)2 - 過濾器

TIPS1: 過濾器是一個數(shù)組時冷守,序列化結(jié)果只包含數(shù)組中列出的屬性

let result = JSON.stringify(person, ["name", "job"]);

// 輸出結(jié)果
// {"name":"KenTsang","job":"Developer"}

TIPS2: 過濾器是一個函數(shù)時(替換函數(shù))

var jsonStr = JSON.stringify(Person, function(key, value){
    if (key == 'age') {
        return 'secret';
    } else {
        return value;
    }
})

// 輸出結(jié)果
// {"name":"KenTsang","age":"secret","job":"Developer"}

如果替換函數(shù)返回的是undefined刀崖,則該屬性不會被包含在序列化結(jié)果中赚爵。

參數(shù)3 - 字符串縮進(jìn)

用于控制序列化結(jié)果中的縮進(jìn)和空白符笙瑟,輸出序列結(jié)果帶縮進(jìn)格式,方便預(yù)覽查看蟹地。實際應(yīng)用開發(fā)不多授翻。

  1. 為數(shù)值時或悲,表示每個級別縮進(jìn)的空格數(shù)(最大10)
  2. 為字符串時,則作為縮進(jìn)字符(替換默認(rèn)的空格堪唐,最大10個字符)
let result = JSON.stringify(person, null, '--');

// 輸出結(jié)果
/*
{
--"name": "KenTsang",
--"age": 27,
--"job": "Developer"
}
*/

toJSON()方法

應(yīng)對更復(fù)雜的一些需求巡语,我們可以通過toJSON()對某些對象進(jìn)行自定義序列化的需求。

let person = {
    name: "KenTsang",
    age: 28,
    job: 'Developer',
    toJSON: function() {
        return {
            "name": "KT",
            "age": "2*",
            "job": "DP"
        }
    }
};

let result = JSON.stringify(person);

// 輸出結(jié)果
// {"name":"KT","age":"2*","job":"DP"}

TIPS: 序列化順序

  1. 如果存著toJSON方法而且能通過它取得有效的值淮菠,則調(diào)用該方法男公。否則,返回對象本身合陵。
  2. 如果提供了第二個參數(shù)枢赔,應(yīng)用這個函數(shù)過濾器。傳入函數(shù)過濾器的值是第(1)步的值拥知。
  3. 對第(2)步返回的每個值進(jìn)行相應(yīng)的序列化踏拜。
  4. 如果提供了第三個參數(shù),執(zhí)行相應(yīng)的格式化低剔。

-- 摘自《JavaScript高級程序設(shè)計》--

parse()

parse用于把JSON字符串解析成JavaScript對象

JSON.parse(text: string, reviver: function(key, value) {})

該方法接受三個參數(shù)

  1. 參數(shù):接收傳入的json字符串
  2. 參數(shù):還原函數(shù)

還原函數(shù)

  1. 返回undefined, 結(jié)果中刪除相應(yīng)的鍵
  2. 返回其它值速梗,則將值插入到結(jié)果中
let Person = {
    name: "KenTsang",
    age: 28,
    job: "Developer",
    birth: new Date(1991, 3, 19)
};

var jsonStr = JSON.stringify(Person);
var jsObj = JSON.parse(jsonStr, function(key, value) {
    if (key == 'birth') {
        return new Date(value);
    } else {
        return value);
    }
});

jsObj.birth.getFullYearh(); 

// 輸出結(jié)果: 1991

例子中通過還原函數(shù)肮塞,重新實例一個Date對象,所以可以用到getFullYear()方法姻锁。


參考文檔

作者:以樂之名
本文原創(chuàng)枕赵,有不當(dāng)?shù)牡胤綒g迎指出。轉(zhuǎn)載請指明出處位隶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拷窜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涧黄,更是在濱河造成了極大的恐慌篮昧,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弓熏,死亡現(xiàn)場離奇詭異恋谭,居然都是意外死亡,警方通過查閱死者的電腦和手機挽鞠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狈孔,“玉大人信认,你說我怎么就攤上這事【椋” “怎么了嫁赏?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長油挥。 經(jīng)常有香客問我潦蝇,道長,這世上最難降的妖魔是什么深寥? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任攘乒,我火速辦了婚禮,結(jié)果婚禮上惋鹅,老公的妹妹穿的比我還像新娘则酝。我一直安慰自己,他們只是感情好闰集,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布沽讹。 她就那樣靜靜地躺著,像睡著了一般武鲁。 火紅的嫁衣襯著肌膚如雪爽雄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天沐鼠,我揣著相機與錄音挚瘟,去河邊找鬼蝇率。 笑死,一個胖子當(dāng)著我的面吹牛刽沾,可吹牛的內(nèi)容都是我干的本慕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼侧漓,長吁一口氣:“原來是場噩夢啊……” “哼锅尘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起布蔗,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤藤违,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纵揍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顿乒,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年泽谨,在試婚紗的時候發(fā)現(xiàn)自己被綠了璧榄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吧雹,死狀恐怖骨杂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雄卷,我是刑警寧澤搓蚪,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站丁鹉,受9級特大地震影響妒潭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揣钦,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一雳灾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拂盯,春花似錦佑女、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至空凸,卻和暖如春嚎花,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呀洲。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工紊选, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啼止,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓兵罢,卻偏偏與公主長得像献烦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卖词,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)巩那,也就是一...
    悟名先生閱讀 4,149評論 0 13
  • 引言 曾經(jīng)有一段時間,XML是互聯(lián)網(wǎng)上傳輸結(jié)構(gòu)化數(shù)據(jù)的事實標(biāo)準(zhǔn)此蜈。Web服務(wù)的第一次浪潮很大程度上都是建立在XML之...
    DHFE閱讀 628評論 0 0
  • 單例模式可謂是面試中的常青樹即横,每當(dāng)看到單例模式的七種寫法時我總會想起孔乙己的茴字的四種寫法。說正題裆赵,首先解決幾個問...
    lvlvforever閱讀 204評論 0 0
  • 十六年前东囚,我原本是個很快樂的孩子可以有個快樂的童年,在我五歲的時候父母就拋下我去了遠(yuǎn)方战授,一拋就是九年页藻,在這九年里我...
    落魄的公主閱讀 215評論 0 0
  • 總是會莫名的難過和煩躁,感覺控制不好自己情緒陈醒。想一個人多出去走走惕橙,但是擔(dān)心的太多,考慮時間太長就拖著哪也去不了钉跷。 ...
    貓宅君閱讀 172評論 0 0