1. 程式人生 > >JS語言學習——JSON

JS語言學習——JSON

JSON是 JavaScript Object Notation的縮寫,它是一種資料交換格式。

在JSON出現前,大家一直用XML來傳遞資料,因為XML是一種純文字格式,適合在網路上傳遞資料,但是XML加上一堆複雜的規範(諸如DTD,XPath等)以後,就變得極為複雜起來,所以在2002年Douglas Crockford為了解決這類問題,發明了JSON這種超輕量級的資料交換格式。

在JSON中,一共有以下幾種資料型別:

  • number:和JS中的number完全一致
  • boolean:就是JS中的truefalse
  • 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}