《JSON必知必會(huì)》學(xué)習(xí)筆記(一)

什么是JSON

JSON全稱是Javascript Object Notation(對(duì)象表示法),是一種在不同平臺(tái)間傳遞數(shù)據(jù)的文本格式(數(shù)據(jù)交換格式)。常見的數(shù)據(jù)交換格式有XML粒竖、JSON兩種喊崖,我們主要研究JSON。

數(shù)據(jù)交換格式十分重要簸喂,開發(fā)人員需要使用它們來實(shí)現(xiàn)不同系統(tǒng)之間的數(shù)據(jù)交換活孩。

JSON基于Javascript對(duì)象字面量物遇,但是獨(dú)立于任何編程語言,真正重要的是表示法本身憾儒,所以在學(xué)習(xí)JSON之前不必先學(xué)習(xí)Javascript。當(dāng)然乃沙,有Javascript基礎(chǔ)那是再好不過了起趾。

JSON語法

JSON中使用鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),示例如下:

{
    "name": "dawei",
    "age":22,
    "isMan":true
}

名稱始終需要加上雙引號(hào)警儒,多個(gè)鍵值對(duì)使用逗號(hào)隔開训裆。

以下兩種表示方式都是錯(cuò)誤的:

{ name: "dawei" }

這是Javascript對(duì)象而不是JSON

{ 'name': 'dawei' }

這也是Javascript對(duì)象,因?yàn)樵贘avascript對(duì)象中允許使用單引號(hào)代替雙引號(hào)蜀铲。

JSON數(shù)據(jù)交換格式可以作為獨(dú)立的文件存在于文件系統(tǒng)中边琉,文件擴(kuò)展名為.json。在傳遞數(shù)據(jù)的時(shí)候需要提前告知接收方接收的數(shù)據(jù)是什么類型记劝。這時(shí)候就會(huì)涉及到媒體類型变姨,也叫做內(nèi)容類型或者M(jìn)IME類型。常見的MIME類型是text/html厌丑,JSON的MIME類型是application/json定欧。

JSON數(shù)據(jù)類型

JSON中的數(shù)據(jù)類型包括:對(duì)象、字符串怒竿、數(shù)字砍鸠、布爾值、null和數(shù)組耕驰。

對(duì)象類型

JSON中的對(duì)象類型十分簡單爷辱,JSON本身就是對(duì)象,也就是被一對(duì)花括號(hào){}包裹的鍵值對(duì)的列表。對(duì)象可以嵌套使用饭弓。

對(duì)象可以包含多個(gè)鍵值對(duì)双饥。鍵必須是字符串,值可以是合法的 JSON 數(shù)據(jù)類型(字符串, 數(shù)字, 對(duì)象, 數(shù)組, 布爾值或 null)示启。

{
    "person":{
        "name":"dawei",
        "age":23,
        "isBoy":true
    }
}

字符串類型

在JSON中字符串必須并且只能使用雙引號(hào)包裹起來兢哭。在JSON中,鍵都是字符串類型夫嗓。在Javascript中迟螺,使用單引號(hào)和雙引號(hào)沒有任何區(qū)別。但是JSON不是Javascript對(duì)象字面量舍咖,它只是基于Javascript對(duì)象字面量矩父。

對(duì)于JSON解析器來說,當(dāng)一個(gè)值以雙引號(hào)開始時(shí)排霉,它希望接下來的字符串文本以另一個(gè)雙引號(hào)結(jié)尾窍株。這意味著如果這段字符串本身包含雙引號(hào)可能會(huì)報(bào)錯(cuò)。這時(shí)候我們需要使用反斜杠對(duì)字符串中的雙引號(hào)進(jìn)行轉(zhuǎn)義攻柠。

{
    "promo":"He say \"Bob`s the best!\" at classroom"
}

數(shù)字類型

JSON中的數(shù)字類型可以是整數(shù)球订、小數(shù)、負(fù)數(shù)或者是指數(shù)瑰钮。

布爾類型

JSON中的布爾值僅可使用小寫形式:true或false冒滩,其他任何寫法都會(huì)報(bào)錯(cuò)。

null類型

在JSON中浪谴,使用null表示一無所有开睡、不存在等意思。

對(duì)于下面這個(gè)例子苟耻,由于對(duì)象不戴手表篇恒,所以他不存在手表顏色:

{
    "freckleCount":0,
    "fairy":true,
    "watchColor":null
}

數(shù)組類型

數(shù)組始終應(yīng)該被方括號(hào)[]包裹。數(shù)組中的值使用逗號(hào)隔開凶杖。

這些值可以是任何合法的JSON數(shù)據(jù)類型胁艰。所以可以有字符串構(gòu)成的數(shù)組、數(shù)字構(gòu)成的數(shù)組官卡、布爾值構(gòu)成的數(shù)組蝗茁、對(duì)象構(gòu)成的數(shù)組甚至是數(shù)組構(gòu)成的數(shù)組。

在數(shù)組中也可包含不同數(shù)據(jù)類型的值:

{
    "eggCarton":["egg",null,"egg",5,"egg"]
}

這在JSON中也是合法的寻咒,但是我們應(yīng)該避免這樣使用哮翘。因?yàn)槿绻覀儗煌瑪?shù)據(jù)類型的數(shù)組的JSON傳遞給一個(gè)不使用Javascript的系統(tǒng),那么在解析的時(shí)候很可能會(huì)報(bào)錯(cuò)毛秘。

JSON 模式(Schema)

JSON中的數(shù)據(jù)通過互聯(lián)網(wǎng)或其他網(wǎng)絡(luò)傳輸?shù)浇邮辗椒顾拢邮辗綍?huì)對(duì)它要接收的數(shù)據(jù)有一個(gè)預(yù)期阻课。接收方會(huì)提供一個(gè)文檔來解釋預(yù)期的格式并且提供示例。此外艰匙,JSON模式亦可以被接收方用于傳輸方的另一端限煞。JSON模式往往位于要接收數(shù)據(jù)的第一行,以保證數(shù)據(jù)符合要求员凝。

我們統(tǒng)稱上述做法為“一致性驗(yàn)證”署驻,在這里要驗(yàn)證三個(gè)方面的內(nèi)容:

  • 值的類型是否正確——可以具體規(guī)定一個(gè)值是數(shù)字、字符串等類型
  • 是否包含所需要的數(shù)據(jù)——可以規(guī)定哪些數(shù)據(jù)是必須的健霹,哪些是不需要的
  • 值的形式是否是我們需要的——可以指定范圍旺上、最小值和最大值

JSON Schema使用JSON來書寫,一個(gè)完整的JSON Schema格式的文件如下所示:

{
    "$schema":"http://json-schema.org/draft-04/schema#",
    "title":"Cat",
    "properties":{
        "name":{
            "type":"string",
            "minLength":3,
            "maxLength":20
        },
        "age":{
            "type":"number",
            "description":"You cat's age in years.",
            "minimum":0
        },
        "declawed":{
            "type":"boolean"
        },
        "description":{
             "type":"string"
        }
    },
    "required":[
        "name",
        "age",
        "declawed"
    ]
}

在這個(gè)文件中糖埋,第一個(gè)鍵值對(duì)聲明了一個(gè)schema文件宣吱,第二個(gè)鍵值對(duì)是該文件的標(biāo)題,第三個(gè)鍵值對(duì)是需要包含在JSON中的屬性瞳别,第四個(gè)鍵值對(duì)指定必須包含的屬性征候。在屬性值中,又說明了屬性類型祟敛、對(duì)屬性的描述和值的范圍疤坝。

JSON中的安全問題

JSON本身不存在任何安全問題,但是在web中使用JSON時(shí)卻常出現(xiàn)兩個(gè)安全問題:跨站請(qǐng)求偽造和跨站腳本攻擊馆铁。

跨站請(qǐng)求偽造

跨站請(qǐng)求偽造(CSRF)是一種利用站點(diǎn)對(duì)用戶瀏覽器的信任而發(fā)起攻擊的方式卒煞。

這個(gè)信任其實(shí)就是用戶的登錄憑證,黑客為了得到用戶的憑證叼架,會(huì)在用戶登錄站點(diǎn)的情況下向用戶發(fā)送大量的偽造“消息提醒”,目的就是為了讓用戶點(diǎn)擊它衣撬,訪問它帶有危險(xiǎn)腳本的網(wǎng)站乖订。一旦用戶點(diǎn)擊這一消息提醒、訪問該惡意網(wǎng)站具练,黑客就可獲取用戶的敏感信息(登錄憑證)實(shí)現(xiàn)攻擊:

<script src="https://www.yourspecialbank.com/user.json"></script>

一般安全意識(shí)較差的網(wǎng)站使用下列這樣的JSON URL存放敏感信息:

[
    {
        "username":"dawei"
    },
    {
        "phone":"555-555-555"
    }
]

這里的JSON格式是合法的乍构,但是它十分危險(xiǎn),因?yàn)樗彩强蓤?zhí)行的JS腳本扛点,黑客可以輕易的將其保存到自己站點(diǎn)的腳本中哥遮。

如何阻止CSRF攻擊?

首先陵究,應(yīng)該將數(shù)組作為一個(gè)值存入JSON對(duì)象眠饮,這樣數(shù)組將不再是合法的JavaScript,腳本也就無法加載它铜邮。

{
    "info":[
        {
            "username":"dawei"
        },
        {
            "phone":"555-555-555"
        }
    ]
}

其次仪召,站點(diǎn)應(yīng)該只允許post請(qǐng)求寨蹋,靜止使用get請(qǐng)求。這樣黑客就無法使用腳本中的URL了扔茅。

注入攻擊

注入攻擊都是利用系統(tǒng)本身的漏洞向網(wǎng)站注入惡意代碼來進(jìn)行攻擊的已旧。

跨站腳本攻擊

跨站腳本攻擊(XSS)是注入攻擊的一種。在使用JSON時(shí)常見的安全漏洞通常發(fā)生在Javascript從服務(wù)器獲取到一段JSON字符串并將其轉(zhuǎn)化成JavaScript對(duì)象的時(shí)候召娜。

在JavaScript中运褪,可以使用eval()函數(shù)來進(jìn)行這一操作:

var jsonString = '{"animal":"cat"}';
var myObject = eval("("+ jsonString +")");
alert(myObject.animal);

這好像沒什么問題,但是如果服務(wù)器或者服務(wù)器發(fā)來的JSON被攻擊玖瘸,攜帶了惡意代碼秸讹,這樣的話情況將會(huì)很糟糕:

var jsonString = "alert('this is bad code')";
var myObject = eval("("+ jsonString +")");
alert(myObject.animal);

eval()的問題在于它會(huì)將傳入的字符串無差別的編譯執(zhí)行,這樣的話就會(huì)給黑客以可乘之機(jī)店读,很可能會(huì)給我們帶來不可估計(jì)的損失嗦枢。

為了解決這一問題,引入了JSON.parse()方法屯断,這一函數(shù)僅解析JSON文虏,不會(huì)執(zhí)行腳本:

var jsonString = '{"animal":"cat"}';
var myObject = JSON.parse("("+ jsonString +")");
alert(myObject.animal);

未完待續(xù)...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市殖演,隨后出現(xiàn)的幾起案子氧秘,更是在濱河造成了極大的恐慌,老刑警劉巖趴久,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丸相,死亡現(xiàn)場離奇詭異,居然都是意外死亡彼棍,警方通過查閱死者的電腦和手機(jī)灭忠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來座硕,“玉大人弛作,你說我怎么就攤上這事』遥” “怎么了映琳?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜘拉。 經(jīng)常有香客問我萨西,道長,這世上最難降的妖魔是什么旭旭? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任谎脯,我火速辦了婚禮,結(jié)果婚禮上您机,老公的妹妹穿的比我還像新娘穿肄。我一直安慰自己年局,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布咸产。 她就那樣靜靜地躺著矢否,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脑溢。 梳的紋絲不亂的頭發(fā)上僵朗,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音屑彻,去河邊找鬼验庙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛社牲,可吹牛的內(nèi)容都是我干的粪薛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼搏恤,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼违寿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熟空,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤藤巢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后息罗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掂咒,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年迈喉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绍刮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挨摸,死狀恐怖录淡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情油坝,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布刨裆,位于F島的核電站澈圈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帆啃。R本人自食惡果不足惜瞬女,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望努潘。 院中可真熱鬧诽偷,春花似錦坤学、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眠冈,卻和暖如春飞苇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜗顽。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工布卡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雇盖。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓忿等,卻偏偏與公主長得像,于是被迫代替她去往敵國和親崔挖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贸街,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)虚汛,斷路器匾浪,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • [toc] JSON必知必會(huì) 學(xué)習(xí)網(wǎng)站:SafariBooksOnline 它是什么?我可以用它做什么卷哩?那些別有用...
    z嘉嘉嘉閱讀 1,072評(píng)論 0 11
  • 一個(gè)優(yōu)秀的團(tuán)隊(duì)蛋辈,最好的管理并非是幾個(gè)領(lǐng)導(dǎo)人,需要大家的共同努力與付出将谊,是靠人人自律冷溶。 一個(gè)優(yōu)秀的團(tuán)隊(duì),最大的幸福尊浓,...
    快樂中姐閱讀 707評(píng)論 0 0
  • -----本文寫于2016年7月13日 南海有那么一點(diǎn)動(dòng)靜逞频,國人群情激昂,大有甘灑熱血寫春秋的意思栋齿。其實(shí)沒必要苗胀,該...
    潘國旭閱讀 306評(píng)論 0 1
  • 在生活中總會(huì)遇到一堆渣渣,何必拿別人的錯(cuò)誤來懲罰自己瓦堵!自己心態(tài)要好基协,認(rèn)真做好自己的事情,不理她就成菇用!但是她確實(shí)是個(gè)辣雞
    阿西吧哦閱讀 189評(píng)論 0 0