JavaScript之JSON初理解

一茎匠、JSON 格式的數(shù)據(jù)需要遵循什么規(guī)則

JSON 格式(JavaScript Object Notation 的縮寫)是一種用于數(shù)據(jù)交換的文本格式,2001年由 Douglas Crockford 提出凯肋,目的是取代繁瑣笨重的 XML 格式造烁。

JSON 對值的類型和格式有嚴(yán)格的規(guī)定。

  1. 復(fù)合類型的值只能是數(shù)組或?qū)ο蟛洋荒苁呛瘮?shù)药磺、正則表達(dá)式對象、日期對象木缝。
  2. 簡單類型的值只有四種:字符串、數(shù)值(必須以十進(jìn)制表示)我碟、布爾值和null(不能使用NaN, Infinity, -Infinity和undefined)。
  3. 字符串必須使用雙引號表示吱殉,不能使用單引號厘托。
  4. 對象的鍵名必須放在雙引號里面。
  5. 數(shù)組或?qū)ο笞詈笠粋€成員的后面押赊,不能加逗號包斑。

需要注意的是,空數(shù)組和空對象都是合格的 JSON 值罗丰,null本身也是一個合格的 JSON 值。

二枕稀、處理 JSON 格式數(shù)據(jù)的兩個方法

ES5 新增了JSON對象谜嫉,用來處理 JSON 格式數(shù)據(jù)。它有兩個方法:JSON.stringify()和JSON.parse()哆档。

JSON.stringify()

JSON.stringify方法用于將一個值轉(zhuǎn)為字符串住闯。該字符串符合 JSON 格式,并且可以被JSON.parse方法還原比原。

JSON.stringify('abc') // ""abc""
JSON.stringify(1) // "1"
JSON.stringify(false) // "false"
JSON.stringify([]) // "[]"
JSON.stringify({}) // "{}"

JSON.stringify([1, "false", false])
// '[1,"false",false]'

JSON.stringify({ name: "張三" })
// '{"name":"張三"}'

需要注意的是,對于原始類型的字符串雇寇,轉(zhuǎn)換結(jié)果會帶雙引號。

JSON.stringify('foo') === "foo" // false
JSON.stringify('foo') === "\"foo\"" // true

上面代碼中嫩海,字符串foo囚痴,被轉(zhuǎn)成了""foo""。這是因為將來還原的時候深滚,雙引號可以讓 JavaScript 引擎知道,foo是一個字符串展箱,而不是一個變量名蹬昌。

如果原始對象中,有一個成員的值是undefined栖榨、函數(shù)或 XML 對象明刷,這個成員會被過濾。

var obj = {
  a: undefined,
  b: function () {}
};

JSON.stringify(obj) // "{}"

上面代碼中辈末,數(shù)組arr的成員是undefined和函數(shù),它們都被轉(zhuǎn)成了null轰枝。

如果數(shù)組的成員是undefined组去、函數(shù)或 XML 對象,則這些值被轉(zhuǎn)成null从隆。

var arr = [undefined, function () {}];
JSON.stringify(arr) // "[null,null]"

JSON.stringify方法會忽略對象的不可遍歷屬性。

JSON.parse()

JSON.parse方法用于將JSON字符串轉(zhuǎn)化成對象键闺。

JSON.parse('{}') // {}
JSON.parse('true') // true
JSON.parse('"foo"') // "foo"
JSON.parse('[1, 5, "false"]') // [1, 5, "false"]
JSON.parse('null') // null

var o = JSON.parse('{"name": "張三"}');
o.name // 張三

如果傳入的字符串不是有效的JSON格式辛燥,JSON.parse方法將報錯盅藻。

JSON.parse("'String'") // illegal single quotes
// SyntaxError: Unexpected token ILLEGAL

上面代碼中畅铭,雙引號字符串中是一個單引號字符串勃蜘,因為單引號字符串不符合JSON格式,所以報錯缭贡。

三、使用JSON實現(xiàn)深拷貝

var obj = {
    address: 'Beijing',
    time: 3,
    friends: ['aa', 'bb', 'cc']
}
var obj1 = JSON.parse(JSON.stringify(obj))
obj1.time = 6
console.log(obj.time)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市恩袱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纲岭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窃判,死亡現(xiàn)場離奇詭異喇闸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)唆樊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來座咆,“玉大人,你說我怎么就攤上這事堤舒〔肝兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵国撵,是天一觀的道長。 經(jīng)常有香客問我介牙,道長,這世上最難降的妖魔是什么囚似? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任线得,我火速辦了婚禮,結(jié)果婚禮上募狂,老公的妹妹穿的比我還像新娘魏保。我一直安慰自己,他們只是感情好谓罗,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布檩咱。 她就那樣靜靜地躺著,像睡著了一般绊含。 火紅的嫁衣襯著肌膚如雪炊汹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天充甚,我揣著相機(jī)與錄音霸褒,去河邊找鬼。 笑死废菱,一個胖子當(dāng)著我的面吹牛抖誉,可吹牛的內(nèi)容都是我干的衰倦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼梳杏,長吁一口氣:“原來是場噩夢啊……” “哼淹接!你這毒婦竟也來了叛溢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厢蒜,失蹤者是張志新(化名)和其女友劉穎烹植,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巷屿,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡墩虹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年诫钓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片问拘。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡惧所,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纯路,到底是詐尸還是另有隱情,我是刑警寧澤顶岸,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站霹抛,受9級特大地震影響卷谈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜世蔗,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一污淋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寸爆,春花似錦、人聲如沸仅醇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甲抖。三九已至,卻和暖如春准谚,著一層夾襖步出監(jiān)牢的瞬間去扣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工唆铐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留奔滑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓王浴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氓辣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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