如果你要手動生成 JSON,應(yīng)將代碼復(fù)制并粘貼 到 JSON lint 工具(如 jsonlint.com)撩扒,以快速輕松地找到語法 錯誤似扔。lint 工具是一個軟件沽甥,用于分析代碼盯桦,查找語法 錯誤。
JSON是JavaScript Object Notation的縮寫到逊,它是一種數(shù)據(jù)交換格式泉手。
在JSON出現(xiàn)之前黔寇,大家一直用XML來傳遞數(shù)據(jù)。因為XML是一種純文本格式斩萌,所以它適合在網(wǎng)絡(luò)上交換數(shù)據(jù)缝裤。XML本身不算復(fù)雜,但是颊郎,加上DTD倘是、XSD、XPath袭艺、XSLT等一大堆復(fù)雜的規(guī)范以后搀崭,任何正常的軟件開發(fā)人員碰到XML都會感覺頭大了,最后大家發(fā)現(xiàn)猾编,即使你努力鉆研幾個月瘤睹,也未必搞得清楚XML的規(guī)范。
終于答倡,在2002年的一天轰传,道格拉斯·克羅克福特(Douglas Crockford)同學(xué)為了拯救深陷水深火熱同時又被某幾個巨型軟件企業(yè)長期愚弄的軟件工程師,發(fā)明了JSON這種超輕量級的數(shù)據(jù)交換格式瘪撇。
道格拉斯同學(xué)長期擔任雅虎的高級架構(gòu)師获茬,自然鐘情于JavaScript港庄。他設(shè)計的JSON實際上是JavaScript的一個子集。
在JSON中恕曲,一共就這么幾種數(shù)據(jù)類型:
number:和JavaScript的number完全一致鹏氧;
boolean:就是JavaScript的true或false;
string:就是JavaScript的string佩谣;
null:就是JavaScript的null把还;
array:就是JavaScript的Array表示方式——[];
object:就是JavaScript的{ ... }表示方式茸俭。
以及上面的任意組合吊履。
并且,JSON還定死了字符集必須是UTF-8调鬓,表示多語言就沒有問題了艇炎。為了統(tǒng)一解析,★JSON的字符串規(guī)定必須用雙引號""腾窝,Object的鍵也必須用雙引號""缀踪。
由于JSON非常簡單,很快就風(fēng)靡Web世界燕锥,并且成為ECMA標準辜贵。幾乎所有編程語言都有解析JSON的庫悯蝉,而在JavaScript中归形,我們可以直接使用JSON,因為JavaScript內(nèi)置了JSON的解析鼻由。
把任何JavaScript對象變成JSON暇榴,就是把這個對象序列化成一個JSON格式的字符串,這樣才能夠通過網(wǎng)絡(luò)傳遞給其他計算機蕉世。
如果我們收到一個JSON格式的字符串蔼紧,只需要把它反序列化成一個JavaScript對象,就可以在JavaScript中直接使用這個對象了狠轻。
一奸例、序列化
讓我們先把小明這個對象序列化成JSON格式的字符串:
var xiaoming = {
name: '小明',
age: 14,
gender: true,
height: 1.65,
grade: null,
'middle-school': '\"W3C\" Middle School',
skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
JSON.stringify(xiaoming); // '{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}'
要輸出得好看一些,可以加上參數(shù)' '向楼,按縮進輸出:
JSON.stringify(xiaoming, null, ' ');
結(jié)果:
{
"name": "小明",
"age": 14,
"gender": true,
"height": 1.65,
"grade": null,
"middle-school": "\"W3C\" Middle School",
"skills": [
"JavaScript",
"Java",
"Python",
"Lisp"
]
}
第二個參數(shù)用于控制如何篩選對象的鍵值查吊,如果我們只想輸出指定的屬性,可以傳入Array:
JSON.stringify(xiaoming, ['name', 'skills'], ' ');
結(jié)果:
{
"name": "小明",
"skills": [
"JavaScript",
"Java",
"Python",
"Lisp"
]
}
還可以傳入一個函數(shù)湖蜕,這樣對象的每個鍵值對都會被函數(shù)先處理:
function convert(key, value) {
if (typeof value === 'string') {
return value.toUpperCase();
}
return value;
}
JSON.stringify(xiaoming, convert, ' ');
上面的代碼把所有屬性值都變成大寫:
{
"name": "小明",
"age": 14,
"gender": true,
"height": 1.65,
"grade": null,
"middle-school": "\"W3C\" MIDDLE SCHOOL",
"skills": [
"JAVASCRIPT",
"JAVA",
"PYTHON",
"LISP"
]
}
如果我們還想要精確控制如何序列化小明逻卖,可以給xiaoming定義一個toJSON()的方法,直接返回JSON應(yīng)該序列化的數(shù)據(jù):
var xiaoming = {
name: '小明',
age: 14,
gender: true,
height: 1.65,
grade: null,
'middle-school': '\"W3C\" Middle School',
skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
toJSON: function () {
return { // 只輸出name和age昭抒,并且改變了key:
'Name': this.name,
'Age': this.age
};
}
};
JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'
二评也、反序列化
拿到一個JSON格式的字符串炼杖,我們直接用JSON.parse()把它變成一個JavaScript對象:
JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]
JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
JSON.parse('true'); // true
JSON.parse('123.45'); // 123.45
JSON.parse()還可以接收一個函數(shù),用來轉(zhuǎn)換解析出的屬性:
JSON.parse('{"name":"小明","age":14}', function (key, value) {
// 把number * 2:
if (key === 'name') {
return value + '同學(xué)';
}
return value;
}); // Object {name: '小明同學(xué)', age: 14}