JSON 基本使用

歡迎關(guān)注我的CSDN博客叉谜,里面發(fā)布了大量學(xué)習(xí)筆記。
https://xdr630.blog.csdn.net/

1. JSON 是什么院溺?

  • JSON祠乃,全稱是 JavaScript Object Notation姨拥,即 JavaScript對象標記法绣檬。
  • JSON是一種輕量級(Light-Meight)、基于文本的(Text-Based)缩焦、可讀的(Human-Readable)格式读虏。
  • JSON 的名稱中雖然帶有JavaScript,但這是指其語法規(guī)則是參考JavaScript對象的袁滥,而不是指只能用于JavaScript 語言盖桥。
  • JSON無論對于人,還是對于機器來說题翻,都是十分便于閱讀和書寫的揩徊,而且相比 XML(另一種常見的數(shù)據(jù)交換格式),文件更小嵌赠,因此迅速成為網(wǎng)絡(luò)上十分流行的交換格式塑荒。
  • 近年來JavaScript已經(jīng)成為瀏覽器上事實上的標準語言,JavaScript 的風(fēng)靡姜挺,與JSON 的流行也有密切的關(guān)系袜炕。
  • 因為JSON本身就是參考JavaScript 對象的規(guī)則定義的,其語法與JavaScript定義對象的語法幾乎完全相同初家。
  • JSON格式的創(chuàng)始人聲稱此格式永遠不升級,這就表示這種格式具有長時間的穩(wěn)定性乌助,10 年前寫的文件溜在,10年后也能用,沒有任何兼容性問題。

2. JSON 的語法規(guī)則是怎樣的他托?

JSON 的語法規(guī)則十分簡單掖肋,可稱得上“優(yōu)雅完美”,總結(jié)起來有:

  • 數(shù)組(Array)用方括號(“[]”)表示赏参。
  • 對象(0bject)用大括號(“{}”)表示志笼。
  • 名稱/值對(name/value)組合成數(shù)組和對象。
  • 名稱(name)置于雙引號中把篓,值(value)有字符串纫溃、數(shù)值、布爾值韧掩、null紊浩、對象和數(shù)組
  • 并列的數(shù)據(jù)之間用逗號(“,”)分隔
{
    "name": "xdr630",
    "favorite": "programming"
}

3. JSON 和 XML

JSON常被拿來與XML做比較,因為JSON 的誕生本來就多多少少要有取代XNL的意思坊谁。相比 XML费彼,JSON的優(yōu)勢如下:

  • 沒有結(jié)束標簽,長度更短,讀寫更快
  • 能夠直接被JavaScript解釋器解析
  • 可以使用數(shù)組

兩者比較

  • JSON:
{
    "name":"兮動人",
    "age":22,
    "fruits":["apple","pear","grape"]
}
  • XML:
<root>
    <name>兮動人</name>
    <age>22</age>
    <fruits>apple</fruits>
    <fruits>pear</fruits>
    <fruits>grape</fruits>
</root>

4. JSON的解析和生成(JSON 和 JS 對象互轉(zhuǎn))

  • 在JavaScript中,有兩個方法與此相關(guān): JSON.parseJSON.stringify 口芍。

JSON 和 JS 對象互轉(zhuǎn)

  1. 要實現(xiàn)從JSON字符串轉(zhuǎn)換為JS對象箍铲,使用 JSON.parse() 方法:
<script>
    var str = '{"name": "兮動人","age":22}';
    var obj = JSON.parse(str);
    console.log(obj);
</script>
在這里插入圖片描述
  1. 要實現(xiàn)從JS對象轉(zhuǎn)換為JSON字符串,使用 JSON.stringify() 方法:
<script>
    var str = '{"name": "兮動人","age":22}';
    var obj = JSON.parse(str);
    console.log(obj);
        
    var jsonstr = JSON.stringify(obj);
    console.log(jsonstr);
</script>
在這里插入圖片描述

5. JSON格式規(guī)定

在這里插入圖片描述

1鬓椭、對象(0bject)

  • 對象用大括號(“{}”)括起來颠猴,大括號里是一系列的“名稱/值對”,請看概念圖膘融。

    在這里插入圖片描述

  • 兩個并列的數(shù)據(jù)之間用逗號(“,”)隔開芙粱,注意兩點:

  1. 使用英文的逗號(“,”),不要用中文的逗號(“氧映,”)
  2. 最后一個“名稱/值對“之后不要加逗號
  • JSON在線檢查語法:https://www.json.cn/

  • 這里報錯說明JSON中Key/Value不能使用單引號

    在這里插入圖片描述

  • 正確寫法


    在這里插入圖片描述

    2春畔、數(shù)組(Array)

  • 數(shù)組表示一系列有序的值,用方括號(“[]”)包圍起來岛都,并列的值之間用逗號分隔律姨,請看概念圖。

    在這里插入圖片描述

  • 例如臼疫,以下的數(shù)組是合法的:

[1,2,"three","four",true,false,null,[1,2],{"name":"兮動人"}]
在這里插入圖片描述

3择份、名稱/值對(Name/Value)

  • 名稱(Name)是一個字符串,要用雙引號括起來烫堤,不能用單引號荣赶,也不能沒有引號,這一點與JavaScript不同鸽斟。
  • 值的類型只有七種:字符串(string)拔创、數(shù)值(number)、對象(object)富蓄、數(shù)組(array), true剩燥、false、null立倍。不能有這之外的類型灭红,例如undefined、函數(shù)等口注。請看概念圖变擒。
    在這里插入圖片描述

字符串(string)的規(guī)則如下:

  1. 英文雙引號括起來,不能用單引號,也不能沒有疆导。
  2. 字符串中不能單獨出現(xiàn)雙引號()和右斜杠(“\")赁项。
  3. 如果要打雙引號或右斜杠葛躏,需要使用“右斜杠+字符”的形式,例如\”\\悠菜,其它的轉(zhuǎn)義字符也是如此字符串的概念圖舰攒。
    在這里插入圖片描述
  • 轉(zhuǎn)義字符
{
"string":"\\ \" "
}
在這里插入圖片描述
  • 數(shù)值類型,可以使用科學(xué)計數(shù)法表示


    在這里插入圖片描述
{
"number":1e3,
"n1":1e2,
"n2":-100
}
在這里插入圖片描述

6. 字符串轉(zhuǎn)化成對象

在這里插入圖片描述
  • 解析:是指將符合JSON 語法規(guī)則的字符串轉(zhuǎn)換成對象的過程悔醋。
  • 不同的編程語言都提供了解析JSON字符串的方法摩窃,在這里主要講解JavaScript中的解析方法。主要有三種:
  1. 使用eval()
  2. 使用JSON.parse()
  3. 使用第三方庫,例如JQuery等

1芬骄、 eval()

  • eval()函數(shù)的參數(shù)是一個字符串猾愿,其作用是直接執(zhí)行其中的 JavaScript代碼。
  • 案例:eval()解析字符串
<script>
    var str = "console.log('hello')";
    eval(str);
</script>
  • eval 解析字符串的結(jié)果:
在這里插入圖片描述
  • eval()能夠解析JSON字符串账阻。從這里也可以看得出蒂秘,JSON 和JavaScript是高度嵌合的。
  • 案例:eval()解析JSON字符串
<script>
    var str = '{"name":"兮動人","age":22}';
    var obj = eval("("+str+")");
    console.log(obj)
</script>
在這里插入圖片描述
  • 但是,現(xiàn)在已經(jīng)很少直接使用eval()來解析了淘太,如果您的瀏覽器版本真的是很舊姻僧,可能才需要這個方法。此外蒲牧,eval()是一個相對危險的函數(shù)撇贺,因為字符串中可能含有未知因素。在這里冰抢,作為學(xué)習(xí)松嘶,還是要知道這也是一種方法。
  • 請注意 eval()的參數(shù)挎扰,在字符串兩旁加了括號翠订,這是必須的,否則會報錯遵倦。
  • 因為JSON字符串是被大括號(“{}”)包圍的蕴轨,直接放到 eval()會被當成語句塊來執(zhí)行,因此要在兩旁加上括號骇吭,使其變成表達式。

2歧寺、JSON. parse()

  • 現(xiàn)在絕大多數(shù)瀏覽器都以支持JSON.parse()燥狰,是推薦使用的方式
  • 如果輸入了不符合規(guī)范的字符串,會報錯斜筐。

案例:JSON字符串轉(zhuǎn)換為JS對象

<script>
    var str = '{"name":"兮動人","age":22}';
    var obj = JSON.parse(str)
    console.log(obj)
</script>
在這里插入圖片描述
  • JSON.parse()可以有第二個參數(shù)龙致,是一個函數(shù)。此函數(shù)有兩個參數(shù):name和value顷链,分別代表名稱和值目代。當傳入一個JSON字符串后,JSON的每一組名稱/值對都要調(diào)用此函數(shù)。該函數(shù)有返回值榛了,返回值將賦值給當前的名稱(name)在讶。
  • 利用第二個參數(shù),可以在解析JSON字符串的同時對數(shù)據(jù)進行一些處理霜大。

案例:

<script>
    var str = '{"name":"兮動人","age":22}';
    var obj = JSON.parse(str,fun);
    function fun(name,value){
        console.log(name+":"+value);
        return value
    }
    console.log(obj)
</script>
在這里插入圖片描述
  • 可以做判斷處理构哺,當JSON字符串的 name=age 時,設(shè)置age的value=14
<script>
    var str = '{"name":"兮動人","age":22}';
    var obj = JSON.parse(str,fun);
    function fun(name,value){
    if (name == "age")
        value = 14;
        return value
    }
    console.log(obj)
</script>
在這里插入圖片描述

7. JS對象轉(zhuǎn)化為字符串

在這里插入圖片描述
  • 序列化战坤,指將 JavaScript 值轉(zhuǎn)化為JSON字符串的過程曙强。
  • JSON.stringify()能夠?qū)avaScript值轉(zhuǎn)換成JSON字符串。JSON.stringify()生成的字符串可以用JSON.parse()再還原成JavaScript值途茫。

1碟嘴、參數(shù)的含義

JSON.stringify(value[, replacer[, space]])
  1. value:必選參數(shù)。被變換的JavaScript值囊卜,一般是對象或數(shù)組娜扇。
  2. replace:可以省略。有兩種選擇:函數(shù)或數(shù)組边败。
  • 如果是函數(shù)袱衷,則每一組名稱/值對都會調(diào)用此函數(shù),該函數(shù)返回一個值笑窜,作為名稱的值變換到結(jié)果字符串中,如果返回undefined致燥,則該成員被忽略。

案例:

<script>
        var obj = {
            name: "兮動人",
            age: 22
        };
        console.log(obj);

        var jsonstr = JSON.stringify(obj,fun);

        function fun(name,value) {
            if (name=="age")
                value = 18;
                return value;
         }

        console.log(jsonstr)

</script>
在這里插入圖片描述
  • 如果是數(shù)組排截,則只有數(shù)組中存在名稱才能夠被轉(zhuǎn)換嫌蚤,且轉(zhuǎn)換后順序與數(shù)組中的值保持一致。
  • 案例:
<script>
        var obj = {
            a: 1,
            b: 2,
            c: 3,
            d: 4
        };
        console.log(obj);

        var jsonstr = JSON.stringify(obj,["a","b","c"]);
        
        console.log(jsonstr)
</script>
在這里插入圖片描述
  • 把順序改下断傲,對應(yīng)轉(zhuǎn)換的JSON字符串的數(shù)值不變
var jsonstr = JSON.stringify(obj,["c","a","b"]);
在這里插入圖片描述
  1. space:可以省略脱吱。這是為了排版、方便閱讀而存在的认罩∠潋穑可以在JSON字符串中添加空白或制表符等。

2垦垂、value的用法

<script>
var obj = {
            name: "兮動人",
            age: 22
        }
    console.log(obj);
    var jsonstr = JSON.stringify(obj);
    console.log(jsonstr)
</script>
在這里插入圖片描述
  • 當有不符合JSON語法規(guī)則時宦搬,就不會被轉(zhuǎn)換成JSON字符串。
  • 數(shù)組中有函數(shù)時會被轉(zhuǎn)換成 null
<script>
    var obj = {
            name: "兮動人",
            age: 22,
            a: undefined,
            f: function () {

            },
            b:[function () {}]
        }
    console.log(obj);
    var jsonstr = JSON.stringify(obj);
    console.log(jsonstr)        
</script>
在這里插入圖片描述

3劫拗、replace的用法

4间校、space的用法

  • 案例:在上面的基礎(chǔ)上添加
<script>
        var obj = {
            a: 1,
            b: 2,
            c: 3,
            d: 4
        };
        console.log(obj);

        var jsonstr = JSON.stringify(obj,["c","a","b"],"one");

        console.log(jsonstr)
</script>
在這里插入圖片描述
  • 改成制表符:\t
<script>
        var obj = {
            a: 1,
            b: 2,
            c: 3,
            d: 4
        };
        console.log(obj);

        var jsonstr = JSON.stringify(obj,["c","a","b"],"\t");

        console.log(jsonstr)
</script>
在這里插入圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市页慷,隨后出現(xiàn)的幾起案子憔足,更是在濱河造成了極大的恐慌胁附,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滓彰,死亡現(xiàn)場離奇詭異控妻,居然都是意外死亡,警方通過查閱死者的電腦和手機找蜜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門饼暑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洗做,你說我怎么就攤上這事弓叛。” “怎么了诚纸?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵撰筷,是天一觀的道長。 經(jīng)常有香客問我畦徘,道長毕籽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任井辆,我火速辦了婚禮关筒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杯缺。我一直安慰自己蒸播,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布萍肆。 她就那樣靜靜地躺著袍榆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塘揣。 梳的紋絲不亂的頭發(fā)上包雀,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音亲铡,去河邊找鬼才写。 笑死,一個胖子當著我的面吹牛奖蔓,可吹牛的內(nèi)容都是我干的琅摩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼锭硼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜕劝?” 一聲冷哼從身側(cè)響起檀头,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤轰异,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后暑始,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搭独,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年廊镜,在試婚紗的時候發(fā)現(xiàn)自己被綠了牙肝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗤朴,死狀恐怖配椭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雹姊,我是刑警寧澤股缸,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站吱雏,受9級特大地震影響敦姻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歧杏,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一镰惦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧犬绒,春花似錦旺入、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沮协,卻和暖如春龄捡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慷暂。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工聘殖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人行瑞。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓奸腺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親血久。 傳聞我的和親對象是個殘疾皇子突照,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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