深入掌握J(rèn)son
1. JSON 是什么?
JSON 指的是 JavaScript 對象表示法(JavaScript?Object?Notation)
JSON 是輕量級的文本數(shù)據(jù)交換格式
JSON 獨立于語言:JSON 使用 Javascript語法來描述數(shù)據(jù)對象,但是 JSON 仍然獨立于語言和平臺。JSON 解析器和 JSON 庫支持許多不同的編程語言。 目前非常多的動態(tài)(PHP,JSP,.NET)編程語言都支持JSON。
JSON 具有自我描述性,更易理解
2. JSON 的語法規(guī)則是怎樣的?
JSON 語法是 JavaScript 對象表示語法的子集。
數(shù)據(jù)在名稱/值對中
數(shù)據(jù)由逗號分隔
大括號?{}?保存對象
中括號?[]?保存數(shù)組,數(shù)組可以包含多個對象
{ ? ?
"name": "xdr630", ? ?
"favorite": "programming"
}
3. JSON 和 XML
JSON常被拿來與XML做比較,因為JSON 的誕生本來就多多少少要有取代XML的意思。相比 XML,JSON的優(yōu)勢如下:
沒有結(jié)束標(biāo)簽,長度更短,讀寫更快
能夠直接被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.parse
和?JSON.stringify
?。
JSON 和 JS 對象互轉(zhuǎn)
要實現(xiàn)從JSON字符串轉(zhuǎn)換為JS對象,使用?
JSON.parse()
?方法:
<script> ? ?
var str = '{"name": "兮動人","age":22}'; ? ?
var obj = JSON.parse(str); ? ?
console.log(obj);
</script>

要實現(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ī)定

5.1、對象(0bject)
對象用大括號(“{}
”)括起來,大括號里是一系列的“名稱/值對
”,請看概念圖。

兩個并列的數(shù)據(jù)之間用逗號(“,
”)隔開,注意兩點:
使用英文的逗號(“,
”),不要用中文的逗號(“,
”)
最后一個“名稱/值對
“之后不要加逗號
5.2、數(shù)組(Array)
數(shù)組表示一系列有序的值,用方括號(“
[]
”)包圍起來,并列的值之間用逗號分隔,請看概念圖。

例如,以下的數(shù)組是合法的:
[1,2,"three","four",true,false,null,[1,2],{"name":"兮動人"}]

5.3、名稱/值對(Name/Value)
名稱(Name)是一個字符串,要用雙引號括起來,不能用單引號,也不能沒有引號,這一點與JavaScript不同。
值的類型只有七種:
字符串(string)、數(shù)值(number)、對象(object)、數(shù)組(array), true、false、null
。不能有這之外的類型,例如undefined、函數(shù)
等。請看概念圖。

字符串(string
)的規(guī)則如下:
英文雙引號括起來,不能用單引號,也不能沒有。
字符串中不能單獨出現(xiàn)雙引號(
”
)和右斜杠(“\
“)。如果要打雙引號或右斜杠,需要使用“
右斜杠+字符
”的形式,例如\”
和\\
,其它的轉(zhuǎn)義字符也是如此字符串的概念圖。

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

解析:是指將符合JSON 語法規(guī)則的字符串轉(zhuǎn)換成對象的過程。
不同的編程語言都提供了解析JSON字符串的方法,在這里主要講解JavaScript中的解析方法。主要有三種:
使用
eval()
使用
JSON.parse()
使用第三方庫,例如JQuery等
6.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()
會被當(dāng)成語句塊來執(zhí)行,因此要在兩旁加上括號,使其變成表達(dá)式。
6.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
,分別代表名稱和值。當(dāng)傳入一個JSON字符串后,JSON的每一組名稱/值對
都要調(diào)用此函數(shù)。該函數(shù)有返回值,返回值將賦值給當(dāng)前的名稱(name)。利用第二個參數(shù),可以在解析JSON字符串的同時對數(shù)據(jù)進(jìn)行一些處理。
案例:

