快速精通JSON語(yǔ)法

JSON(Java Script Object Notation)是業(yè)界最為普遍的內(nèi)部數(shù)據(jù)交換的輕量級(jí)協(xié)議榆芦,人機(jī)都方便讀寫。JSON語(yǔ)法非常精練亦鳞,我們從它的BNF范式角度來(lái)學(xué)習(xí)可謂是最快速和最容易的學(xué)習(xí)方法僧界。
JSON包含兩種格式,分別用BNF表示就是:

  • 1.name/value對(duì)的object格式


    name/value.png

如下數(shù)據(jù)是符合上圖格式要求的:

[root@VM_0_10_centos ~]# cat person.js 
 { "name":"Mike", "age":34}

對(duì)照BNF圖很好理解型宝,name/value對(duì)一定出現(xiàn)在一對(duì)大括號(hào)里面八匠,每對(duì)之間用逗號(hào)隔開絮爷。
每個(gè)name/value對(duì)中,name一定是json中的string類型數(shù)據(jù)梨树,也即是我們常用的字符串坑夯,value是我們后面要定義的value類型。name和value之間用冒號(hào)隔開抡四。

很顯然柜蜈,下面例子不符合格式要求:

[root@VM_0_10_centos ~]# cat person_err.js 
 { "name":"Mike", "age"}
 { "name":"Mike", }
 { :"Mike", "age":34}

第一個(gè)例子:"age"后面的value沒(méi)有定義。(錯(cuò)誤)
第二個(gè)例子:定義了逗號(hào)指巡,沒(méi)有定義后續(xù)的name/value對(duì)淑履。(錯(cuò)誤)
第三個(gè)例子:第一個(gè)name/value對(duì)的name丟失了。(錯(cuò)誤)
依照BNF圖很容易看出和理解如何保證數(shù)據(jù)符合JSON的格式要求藻雪。

我們要知道秘噪,這里的string和value都還有特殊的格式要求,后面會(huì)介紹和學(xué)習(xí)勉耀。

  • 2.value的array格式


    value order.png

如下數(shù)據(jù)就是符合value的順序列表格式的格式要求的:

[root@VM_0_10_centos ~]# cat  persons.js 
[ "Bill" , "Mike" , "John" ]

按照要求指煎,value的array一定包含在一對(duì)方括號(hào)之間,這有限對(duì)的value的列表之間用逗號(hào)隔開便斥。
按照?qǐng)D示至壤,我們很容易理解如下的數(shù)據(jù)格式是不符合語(yǔ)法要求的:

[root@VM_0_10_centos ~]# cat  persons_err.js
[ "Bill" , "Mike" , ]
[ , "Mike" , "John" ]

  • 3.值value的構(gòu)成定義


    value.png

按照?qǐng)D示,我們能迅速明白了如何構(gòu)成JSON中的所謂的值枢纠,第一類值就是字符串像街,第二類是數(shù)字,第三類是object晋渺,第四類是array宅广,第五類和第六類是邏輯運(yùn)算的true和false,最后一類就是null些举。而且在值的前后分別有whitespace跟狱。是不是很容易!
特殊的需要交代下:

  • 這里有個(gè)遞歸的引用户魏,object 可以作為value來(lái)使用驶臊。例如:
[root@VM_0_10_centos ~]# cat persons1.js
[ "Manager" , "HR department" , "level20",{ "name":"Mike", "age":34} ]

我們可以簡(jiǎn)單理解為方括號(hào)里面嵌套大括號(hào)。

這里的object 作為了value出行在array中叼丑。

  • value構(gòu)成的array也可以作為value再次遞歸出現(xiàn)关翎。例如:
[[ "Manager" , "HR department" , "level20",{ "name":"Mike", "age":34} ],
[ "Senior Manager" , "IT department" , "level30",{ "name":"Bill", "age":50} ]]

我們簡(jiǎn)單理解為方括號(hào)里嵌套方括號(hào)。

怎樣的值是字符串鸠信?怎樣的值是數(shù)字纵寝?我們都通過(guò)圖示來(lái)學(xué)習(xí)和掌握。

  • 4.whitespace 的構(gòu)成定義


    image.png

    我們看圖識(shí)空白星立,是不是很容易的感覺(jué)爽茴,所以我們明白了JSON中的whitespace可以是真的什么都沒(méi)有葬凳,也可以是若干的空格符、回車符室奏、換行符火焰、制表符構(gòu)成。

[root@VM_0_10_centos ~]# cat persons1.js
[ "Bill"

 ,       "Mike" , "John"
         ]

所以上面這個(gè)例子就是一個(gè)語(yǔ)法完全正確的JSON值的表示胧沫。雖然看起來(lái)七零八落的昌简。

  • 5.string的定義
    JSON中最復(fù)雜的數(shù)據(jù)類型就是string了∪拊梗看看下圖纯赎,是不是比前面的BNF圖都復(fù)雜?


    string.png

    string要么是一對(duì)空的雙引號(hào)南蹂,要么就是除去一下幾個(gè)特殊符號(hào)的任意字符串,unicode一并支持犬金。
    我們要首先認(rèn)識(shí)這幾個(gè)特殊字符符號(hào):
    第一個(gè)就是雙引號(hào):雙引號(hào)本身構(gòu)成了string格式定義的一部分,要表達(dá)string中的雙引號(hào)碎紊,要用反斜線轉(zhuǎn)義表達(dá)佑附。
    第二個(gè)就是反斜線:反斜線的有特殊的轉(zhuǎn)義的作用樊诺。
    其他幾個(gè)特殊的控制符號(hào)必須以反斜線開頭轉(zhuǎn)義使用仗考。
    string中的雙引號(hào):\"
    string中的斜線:\/
    string中的反斜線:\\
    string中的回車:\r
    string中的換行:\n
    string中的換頁(yè):\f
    string中的制表符:\t
    string中的unicode字符:\u
    前面的都很好理解了,最后一個(gè)我們舉例說(shuō)明下:

[root@VM_0_10_centos ~]# cat string.js
 { "name":"\u8d3a", "age":34}

這個(gè)\u8d3a實(shí)際表示的是一個(gè)漢字"賀"。
學(xué)習(xí)完string,其他就是小菜了词爬。

  • 6 number的定義


    number.png

這個(gè)圖看起來(lái)像個(gè)迷宮秃嗜,實(shí)際只要我們明白了數(shù)字的組成部分,就很容易了顿膨。
任何一個(gè)數(shù)锅锨,可以分成整數(shù)部分和小數(shù)部分,如果數(shù)很大恋沃,可以加上指數(shù)表達(dá)式必搞。

整數(shù)部分的數(shù)字構(gòu)成也很好理解,看看下圖囊咏。


integer.png

是不是我們常見(jiàn)的數(shù)字的整數(shù)部分就是符合這樣的規(guī)律的恕洲。

[root@VM_0_10_centos ~]# cat numbers.js
12345
-345
9876
111111
0.2222
23.e3
111.e-10
98.e+4

-345:負(fù)數(shù),一定有個(gè)負(fù)號(hào)在最左端梅割。
0.2222:純小數(shù)霜第,最左邊整數(shù)部分是0。
9876:最左端是1-9中的任意一個(gè)數(shù)户辞,后面是0-9任意數(shù)的任意組合泌类。

緊接著是小數(shù)部分的定義。如圖底燎。


frac.png

0.2222:小數(shù)點(diǎn)后面刃榨,0-9任意數(shù)的任意組合弹砚,構(gòu)成小數(shù)部分。

最后一個(gè)部分的定義是指數(shù)的定義喇澡。如圖迅栅。


exp.png

23.e3:e(E)是指數(shù)部分的開始,e后面是符號(hào)位晴玖,然后后面是0-9的任意組合读存。
111.e-10:負(fù)指數(shù)必須要有負(fù)號(hào)。負(fù)號(hào)后面是0-9的任意組合呕屎。
98.e+4:正指數(shù)中让簿,正號(hào)是可選的。

好了秀睛,整個(gè)JSON就學(xué)習(xí)完了尔当,真正復(fù)雜的地方就是value定義的遞歸使用。我們使用一個(gè)稍微復(fù)雜的JSON數(shù)據(jù)來(lái)復(fù)習(xí)一下本篇的學(xué)習(xí)內(nèi)容蹂安。

[root@VM_0_10_centos ~]# cat test_schema.js
{
    "type": "object",
    "properties": {
        "first_name": { "type": "string" },
        "last_name": { "type": "string" },
        "age": { "type": "integer" },
        "club": {
            "type": "object",
            "properties": {
                "name": { "type": "string" },
                "founded": { "type": "integer" }
            },
            "required": ["name"]
        }
    },
    "required": ["first_name", "last_name", "age", "club"]
}

整個(gè)是一個(gè)object椭迎,該object由3對(duì)name/value對(duì)構(gòu)成。
第一對(duì)name/value是"type": "object"田盈,很好理解了畜号。
第二對(duì)name/value的value不是簡(jiǎn)單的string或者number,它是另一個(gè)object允瞧。這個(gè)object由5對(duì)name/value對(duì)構(gòu)成简软。這個(gè)object的前面4對(duì)name/value的value又都是另外的object,最后一對(duì)的value是個(gè)array述暂。
第三對(duì)name/value的value是由4個(gè)value構(gòu)成的array痹升。
總體分析還是比較簡(jiǎn)單的。通過(guò)上面的學(xué)習(xí)畦韭,我們對(duì)JSON的語(yǔ)法格式就有了一個(gè)比較深入的了解和學(xué)習(xí)疼蛾,對(duì)常見(jiàn)的JSON數(shù)據(jù)格式,可以做到心中有數(shù)了艺配。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末察郁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子妒挎,更是在濱河造成了極大的恐慌绳锅,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酝掩,死亡現(xiàn)場(chǎng)離奇詭異鳞芙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門原朝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)驯嘱,“玉大人,你說(shuō)我怎么就攤上這事喳坠【掀溃” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵壕鹉,是天一觀的道長(zhǎng)剃幌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晾浴,這世上最難降的妖魔是什么负乡? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮脊凰,結(jié)果婚禮上抖棘,老公的妹妹穿的比我還像新娘。我一直安慰自己狸涌,他們只是感情好切省,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帕胆,像睡著了一般朝捆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惶楼,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天右蹦,我揣著相機(jī)與錄音诊杆,去河邊找鬼歼捐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晨汹,可吹牛的內(nèi)容都是我干的豹储。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼淘这,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剥扣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起铝穷,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钠怯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后曙聂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晦炊,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了断国。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贤姆。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖稳衬,靈堂內(nèi)的尸體忽然破棺而出霞捡,到底是詐尸還是另有隱情,我是刑警寧澤薄疚,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布碧信,位于F島的核電站,受9級(jí)特大地震影響街夭,放射性物質(zhì)發(fā)生泄漏音婶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一莱坎、第九天 我趴在偏房一處隱蔽的房頂上張望衣式。 院中可真熱鬧,春花似錦檐什、人聲如沸碴卧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)住册。三九已至,卻和暖如春瓮具,著一層夾襖步出監(jiān)牢的瞬間荧飞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工名党, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叹阔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓传睹,卻偏偏與公主長(zhǎng)得像耳幢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子欧啤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355