成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

哎喲,這就是JSON

邱勇 / 3131人閱讀

摘要:官方的說法,也不是特別的明了,只說明了這是一種輕量級(jí)的數(shù)據(jù)交換格式,且基于一個(gè)子集。的語(yǔ)法介紹常見數(shù)據(jù)結(jié)構(gòu)有兩種形式,其分別是名稱值對(duì)的集合,類似中的對(duì)象。比如,則在中是行不通的。

寫這篇文章的緣由

你了解JSON嘛?JSON是JavaScript中對(duì)象嘛?JSON可以存儲(chǔ)function對(duì)象嘛?JSON的本質(zhì)是什么呢?JSON能寫注釋嘛?
如果你都能答上來,那恭喜你,你對(duì)JSON了解的很測(cè)底,如果你有寫不太明白,哪有必要和我一起來探討JSON。

我之前對(duì)JSON的概念也是一知半解,常常和JavaScript的Object對(duì)象混淆,所以就導(dǎo)致了很多種種的錯(cuò)誤,特別是在研究NodeJS中,有一個(gè)叫package.json的文件專門用來存儲(chǔ)json格式的數(shù)據(jù)。如果你在這個(gè)文件里面寫注釋,或者存儲(chǔ)函數(shù),最終解析這個(gè)文件時(shí)就會(huì)報(bào)錯(cuò)。

然后自己查閱了些相關(guān)的資料,得出些結(jié)論?,F(xiàn)在拿出來和大家分享一下,同時(shí),假如文章中有紕漏的地方,大家可以幫我指點(diǎn)糾正下。

JSON是什么

首先我們來看看官方是怎么描述JSON的:JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。 易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個(gè)子集。 JSON采用完全獨(dú)立于語(yǔ)言的文本格式,但是也使用了類似于C語(yǔ)言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的數(shù)據(jù)交換語(yǔ)言。參考來源地址:http://www.json.org/json-zh.html。

官方的說法,也不是特別的明了,只說明了這是一種輕量級(jí)的數(shù)據(jù)交換格式,且基于JavaScript一個(gè)子集。這根本說明不了什么?不過我聯(lián)想到了另外一種數(shù)據(jù)交換格式,那就是xml,這個(gè)格式特別在webService中被大量使用。xml是什么呢,其本質(zhì)是一種DOM結(jié)構(gòu)。對(duì)比一下,那json本質(zhì)就是字符串了,不過這個(gè)字符串不是不同的字符串,它有一些列的語(yǔ)法和結(jié)構(gòu)。下面我們就介紹下其語(yǔ)法。

JSON的語(yǔ)法介紹

常見JSON數(shù)據(jù)結(jié)構(gòu)有兩種形式,其分別是:

“名稱/值”對(duì)的集合,類似JavaScript中的對(duì)象。

值的有序列表(An ordered list of values)。在大部分語(yǔ)言中,它被理解為數(shù)組(array)。

首先來看第一種情況:對(duì)象是一個(gè)無序的“‘名稱/值’對(duì)”集合。一個(gè)對(duì)象以“{”(左括號(hào))開始,“}”(右括號(hào))結(jié)束。每個(gè)“名稱”后跟一個(gè)“:”(冒號(hào));“‘名稱/值’ 對(duì)”之間使用“,”(逗號(hào))分隔。

這和JavaScript中的對(duì)象字面量比較類似,但是本質(zhì)上還是有些區(qū)別的。比如對(duì)象中的名稱(或者稱為key)是必須用雙引號(hào)括起來的。單引號(hào)都不行,更別說忽略它了,雖然JavaScript中的對(duì)象中的名稱值常常忽略雙引號(hào)。比如

{
    name : "test",
    age  : 123,
    success : function(){
        //todo
    }
}

則在JSON中是行不通的。除了"名稱(key)"值有限制外,對(duì)象中的"值(value)"也做了限制,比如在JavaScript中的對(duì)象字面量中的值可以隨便賦值,不管是字符串、數(shù)組、函數(shù)、整形都是可以的。JSON中的取值可以是雙引號(hào)括起來的字符串(string)、數(shù)值(number)、true、false、 null、對(duì)象(object)或者數(shù)組(array),

除此之外,這些值以外都會(huì)被解析出問題,像剛才頭中提到的,如果給JSON的值賦值一個(gè)function是一個(gè)錯(cuò)誤的行為。

接下來,看看值的有序列表(或者稱為數(shù)組),數(shù)組是值的有序列表,一個(gè)數(shù)組以“[”(左中括號(hào))開始,“]”(右中括號(hào))結(jié)束。值之間使用“,”(逗號(hào))分隔,并且值的限制情況在上面中已經(jīng)提到。

差不多把語(yǔ)法介紹完了,總結(jié)一下,JSON其本質(zhì)是一串有意義的字符串?dāng)?shù)據(jù)交互格式。呵呵,不知道我定義的正不正確。

JavaScript語(yǔ)言中JSON的解析和序列化

在JavaScript中經(jīng)常是要對(duì)JSON進(jìn)行處理的,比如提交一個(gè)數(shù)據(jù)前常常需要對(duì)其進(jìn)行序列化處理,從后來拉過來的JSON數(shù)據(jù),我們經(jīng)常要對(duì)它進(jìn)行解析然后得到一個(gè)JavaScript對(duì)象。可能由于大家經(jīng)常使用一些JavaScript類庫(kù),這些庫(kù)對(duì)JSON的操作做了封裝,所以造成一種現(xiàn)象,那就是我們只會(huì)用,對(duì)齊本質(zhì),我們了解甚少?,F(xiàn)在我們就拋開類庫(kù),了解其底層的本質(zhì)。

早期的JSON解析器通過JavaScript中eval()函數(shù)來解析的。直到ECMA5對(duì)齊進(jìn)行了規(guī)范,并且定義了一個(gè)全局的JSON對(duì)象用來對(duì)JSON進(jìn)行解析和序列化。支持JSON這個(gè)全局對(duì)象的瀏覽器包括IE8+、FF3.5+、Safari4+、Chrome和Opera10.5+。對(duì)于不支持這個(gè)對(duì)象的瀏覽器比如IE6、IE7怎么做處理呢?

不用擔(dān)心,JSON的發(fā)明者早就幫我們實(shí)現(xiàn)了兼容的代碼,其地址為:https://github.com/douglascrockford/JSON-js。對(duì)于不支持原生的JSON對(duì)象的。我們可以引入這段代碼解決兼容性的問題。

JSON有兩個(gè)主要方法,用來解決JSON的序列化和解析,其分別是stringfyparse.讓我們分別來看看它們的用法。

ECMA5定義的標(biāo)準(zhǔn)接口如下所示:

/**
@param {*} value
@param {Function} [replacer]
@param {Number|String} [space]
@static
*/
JSON.stringify = function(value,replacer,space) {};

其中對(duì)一個(gè)參數(shù)是必須滴,而且是我們要進(jìn)行序列化的對(duì)象。示例代碼如下所示:

var obj = {
    name : "hello",
    age  : 18
}

var jsonText = JSON.stringify(obj)    //輸出:{"name":"hello","age":18}

第二個(gè)參數(shù)是可選項(xiàng),可以是函數(shù)或者是數(shù)組。如果是數(shù)組,那么數(shù)組中指定是過濾項(xiàng),以上面例子為例,進(jìn)行如下調(diào)用:

var jsonText = JSON.stringify(obj,["name"])     //輸出: {"name":"hello"}

如果是函數(shù)的話,回調(diào)函數(shù)里面的參數(shù)對(duì)應(yīng)Javascript中對(duì)象里面的keyvalue值。示例如下:

var jsonText = JSON.stringify(obj,function(key,value){
    switch(key) {
        case "name": return value+" json";
        case "age" : return 20;
        default : return value;
    }
});
//輸出 {"name":"hello json","age":20}

第三個(gè)參數(shù)也是可選的。用來進(jìn)行字符串縮進(jìn),示例如下:

var jsonText = JSON.stringify(obj,null,4); //按4個(gè)空格縮進(jìn)

//輸出的結(jié)果不再是單行,而是下面的形式:
{
    "name" : "hello",
    "age" :  18
}

除了可以設(shè)置數(shù)字外,還可以用字符設(shè)置縮進(jìn),有興趣大家可以嘗試一下。

ECMA5對(duì)parse接口的定義如下:

/**
@param {string} jsonString
@param {Function} [reviver]
@static
*/
JSON.parse = function(jsonString,reviver) {};

該方法接受兩個(gè)參數(shù),其中第二個(gè)參數(shù)是可選的。

第一個(gè)參數(shù)的作用是待轉(zhuǎn)換的JSON字符串。比如我們可以將上面的jsonText通過parse還原成原來的Javascript對(duì)象。

var obj = JSON.parse(jsonText); //obj為JavaScript對(duì)象。

第二個(gè)參數(shù)是一個(gè)函數(shù),用來更加細(xì)微的控制轉(zhuǎn)換過程。它接受兩個(gè)參數(shù),分別對(duì)應(yīng)著JSON數(shù)據(jù)的鍵值對(duì)。調(diào)用示例如下:

   var obj = JSON.parse(jsonText,function(key,value){
        //todo
    }); 
幫助鏈接

JSON中文官網(wǎng)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85466.html

相關(guān)文章

  • 關(guān)于 Django 開發(fā)的 11 件事

    摘要:在這里的腳本有,部署到預(yù)發(fā)布生產(chǎn)服務(wù)器,清理目錄,壓縮,備份數(shù)據(jù)庫(kù),在本地,等等。目錄存儲(chǔ)了所有數(shù)據(jù)庫(kù),,,,等等的配置文件。我使用做所有的排序任務(wù),從發(fā)送郵件到從拉取數(shù)據(jù)。當(dāng)我第一次開始開發(fā)和的時(shí)候,我使用,但是已經(jīng)把所有事情移植進(jìn)了。 本文原文是 11 Things I Wish I Knew About Django Development Before I Star...

    JayChen 評(píng)論0 收藏0
  • VueCli3.0中集成MockApi

    摘要:缺點(diǎn)需要增加本地的代碼量,以及需要配置實(shí)現(xiàn)攔截優(yōu)點(diǎn)數(shù)據(jù)通過會(huì)更豐富。缺點(diǎn)修改內(nèi)容溝通成本高,跟后端扯皮利用去模擬優(yōu)點(diǎn)可控內(nèi)容以及實(shí)現(xiàn)動(dòng)態(tài)。三本地周邊知識(shí)本地的思想就是利用完成。注意接口的和自己的接口不要沖突。 VueCli3.0中集成MockApi 一:使用場(chǎng)景 哎喲,好煩啊,這個(gè)需求還么結(jié)束就來下一個(gè)需求,程序員不要排期的嗎? 沒辦法啊,資本主義的XX嘴臉啊 來吧,技術(shù)評(píng)審我倆把接口...

    劉玉平 評(píng)論0 收藏0
  • Laravel 5.4 正式發(fā)布

    摘要:它的目的是提供正確的方式進(jìn)行頁(yè)面交互測(cè)試,所以可以使用去點(diǎn)擊按鈕或者鏈接填寫表單甚至拖放。此外,提到測(cè)試運(yùn)行比更快。此次因底層架構(gòu)改變較大而重命名。這個(gè)功能受到的啟發(fā),能夠?qū)⒃睾?jiǎn)化為可重用區(qū)域。 showImg(https://segmentfault.com/img/remote/1460000008212617); 轉(zhuǎn)自 Laravel 社區(qū):https://laravel-ch...

    Vultr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<