JS語言學習——JSON
阿新 • • 發佈:2018-12-31
JSON是 JavaScript Object Notation的縮寫,它是一種資料交換格式。
在JSON出現前,大家一直用XML來傳遞資料,因為XML是一種純文字格式,適合在網路上傳遞資料,但是XML加上一堆複雜的規範(諸如DTD,XPath等)以後,就變得極為複雜起來,所以在2002年Douglas Crockford為了解決這類問題,發明了JSON這種超輕量級的資料交換格式。
在JSON中,一共有以下幾種資料型別:
- number:和JS中的
number
完全一致 - boolean:就是JS中的
true
和false
- string:同JS中的
string
- null:同JS中的
Null
- array:就是JS中的
array
的表示方式——[ ] - object:就是JS中的
{....}
表達方式
以及以上型別的任意組合
JSON還定死了字符集必須是UTF-8,表示多語言就沒有問題了。為了統一解析,JSON的字串規定必須用雙引號" "
,object的鍵也必須用" "
。
任何JS物件變成JSON,就是把這個物件序列化成一個JSON格式的字串,這樣才能夠通過網路傳遞給其它計算機;反之,如果我們收到一個JSON格式的字串,只需要將它反序列化為一個JS物件,就可以在JS中直接使用這個物件了。
序列化
例程:
'use strict'; var xiaoming = { name: '小明’, age: 14, gender: true, height:1.65, grade:null, 'middle-schol': '\"W3C\" Middle School' , skills: ['JavaScript', 'Java', 'Python', 'Lisp'] }; var s = JSON.stringify(xiaoming); console.log(s); // {"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}
要輸出得好看一些,可以加上引數,按縮排輸出:
JSON.stringify(xiaoming,null.' ');
結果:
{
"name": "小明",
"age": 14,
"gender": true,
"height": 1.65,
"grade": null,
"middle-school": "\"W3C\" Middle School",
"skills": [
"JavaScript",
"Java",
"Python",
"Lisp"
]
}
第二個引數用於控制如何篩選物件的鍵值,如果我們只想輸出指定的屬性,可以傳入Array
JSON.stringify(xiaoming, ['name', 'skills'], ' ');
結果:
{
"name": "小明",
"skills": [
"JavaScript",
"Java",
"Python",
"Lisp"
]
}
還可以傳入一個函式,這樣物件的每個鍵值對都會被函式先處理:
function convert(key, value) {
if (typeof value == 'string') {
return value.toUpperCase();
}
return value;
}
JSON.stringify(xiaoming, convert, ' ');
如果我們還想要精確控制如何序列化小明,可以給xiaoming
定義一個toJSON()的方法,直接返回JSON應該序列化的資料:
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()
還可以接收一個函式,用來轉換解析出的屬性:
'use strict';
var obj = JSON.parse('{"name":"小明“,"age":14}', function (key, value) {
if (key == 'name') {
return value + '同學' ;
}
return value;
});
console.log(JSON.stringify(obj));// {name:'小明同學', age:14}