JSON

開發(fā)人員覺得XML這種微型 的數(shù)據(jù)結(jié)構(gòu)過于 煩瑣 冗長,為了解決這個(gè)問題,JSON的結(jié)構(gòu)化數(shù)據(jù)出現(xiàn)了。JSON是JavaScript的一個(gè)嚴(yán)格子集,利用Javascript中的一些模式來表示結(jié)構(gòu)化數(shù)據(jù) 。
JSON和XML類型,都是一種結(jié)構(gòu)化的數(shù)據(jù)表示方式 ,所以,JSON并不是JavaSript獨(dú)有的數(shù)據(jù)格式 ,其他很多語言都可以對JSON進(jìn)行解析和序列化.

JSON語法
JSON的語法 可以表示三種類型的值 :
1 簡單值 :可以在JSON中表示字符串 數(shù)值 布爾值和null.但JSON不支持JavaScript中的特殊值undefined.
2對象:顧名思義。
3 數(shù)組:顧名思義。

簡單值
100 "Lee"這兩個(gè)量就是JSON的表示方法,一個(gè)是JSON數(shù)值 ,一個(gè)是JSON字符串。

對象
JavaScript對象字面量表示法:
var box = {
name:"Lee",
age:100
};

而JSON中的對象表示法需要加上雙引號,并且不存在賦值運(yùn)算和分號:
'{"name":"lee","age":100}'

{
"name":"lee",
"age":100
}

普通數(shù)組的表現(xiàn)方式
var box =[100,'lee',true];
JSON數(shù)組
[100,"lee",true]

// ps:JSON說白了就是一個(gè)字符串,所以任何表示,都應(yīng)該加上引號表示字符串。
//PS JSON對象和數(shù)組比普通對象和數(shù)組,少了分號,少了變量賦值,而且本身應(yīng)該是字符串表示。

//最常用的JSON結(jié)構(gòu)

[
    {
       "titile":"a",
        "num":1
    },
    {
       "titile":"b",
        "num":1
    },
    {
       "titile":"c",
        "num":1
    }
]

一般情況下,我們可以把JSON結(jié)構(gòu)數(shù)據(jù)保存到一個(gè)文本文件 里,然后通過XMLHttpRequest對象去加載它,得到這串結(jié)構(gòu)數(shù)據(jù)字符串(XMLHttpRequest對象以后講解)。所以 我們可以模擬這種中

模擬加載JSON文本文件的數(shù)據(jù),并且賦值給變量。

var box='[{"name":"a","age":1},{"name":"b","age":2}]';

//PS 上面這段代碼模擬了var box= load('demo.json')賦值過程 。因?yàn)橥ㄟ^load加載的文本文件 ,不管內(nèi)容是什么 ,都必須是字符串。所以兩邊要加上雙引號。

其實(shí)JSON就是比普通數(shù)組多了兩國賓雙引號
普通數(shù)組如下:
var box =[{name:'a',age:1},{name:'b',age:2}];

二 解析和序列化

如果是載入的JSON文件 ,我們需要對其進(jìn)行使用,那么就必須對JSON字符串解析成原生的JavaScript值 。當(dāng)然如果是原生的JavaScript對象或數(shù)組 ,也可以轉(zhuǎn)換成JSON字符串。

對于講JSON字符串解析成JavaScript原生值,早期采用的是eval()函數(shù)。但這種方法既不安全,可能會執(zhí)行一些惡意代碼 。因?yàn)橥ㄟ^load加載的文本文件

var json ='[{"name":"a","age":1},{"name":"b","age":1}]';
alert(box);   //JSON字符串
var box = eval(json); //使用eval()函數(shù)解析
alert(box);    //得到JavaScript原生值 
alert(box[1].name);   //a

ECMAScript5對解析JSON的行為進(jìn)行規(guī)范,定義了全局對象JSON.
JSON對象提供了兩個(gè)方法,一個(gè)是將原生JavaScript值轉(zhuǎn)為JSON字符串:stringfify(),里面可以傳三個(gè)參數(shù) ,第二個(gè)參數(shù)起過濾做用,可以是數(shù)組 可以是函數(shù),第三個(gè)參數(shù)是縮進(jìn);另一個(gè)是將JSON字符串轉(zhuǎn)換為Javascript原生值 :parse().

var box ='[{"name":"a","age":1},{"name":"b","age":1}]';
alet(box);
var json=JSON.parse(box);
alert(json)

還有種過濾方式,使用toJSON()方法,可以將某一組對象 里指定返回某個(gè)值

var box = [{name:'a',age:1,toJSON:function(){
    return this.name;
}},[{name:'b',age:1,toJSON:function(){
    return this.name;
}}]

序列化也有執(zhí)行順序 ,首先執(zhí)行toJSON()方法;如果應(yīng)用 了第二個(gè)過濾參數(shù),則執(zhí)行這個(gè)方法;然后執(zhí)行序列化過程 ,比如將鍵值對組成合法的JSON字符串,比發(fā)加上雙引號。如果提供了縮進(jìn) ,再執(zhí)行縮進(jìn)操作。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容