JSON: 用于數(shù)據(jù)交換的文本格式
優(yōu)點:書寫簡單擎宝;符合JS原生語法
復(fù)合類型的值只能是數(shù)組或?qū)ο螅荒苁呛瘮?shù)涡上、正則表達(dá)式對象趾断、日期對象。
簡單類型的值只有四種:字符串吩愧、數(shù)值(必須以十進(jìn)制表示)芋酌、布爾值和null(不能使用NaN, Infinity, -Infinity和undefined)。
字符串必須使用雙引號表示雁佳,不能使用單引號脐帝。
對象的鍵名必須放在雙引號里面。
數(shù)組或?qū)ο笞詈笠粋€成員的后面糖权,不能加逗號堵腹。
空數(shù)組和空對象都是合格的 JSON 值,null本身也是一個合格的 JSON 值星澳。
JSON.stringify方法用于將一個值轉(zhuǎn)為字符串疚顷。該字符串符合 JSON 格式,并且可以被JSON.parse方法還原。
JSON.stringify([1, "false", false])
// '[1,"false",false]'
JSON.stringify({ name: "張三" })
// '{"name":"張三"}'
JSON.stringify('foo') === "\"foo\"" // true
字符串foo腿堤,被轉(zhuǎn)成了""foo""
如果原始對象中阀坏,有一個成員的值是undefined、函數(shù)或 XML 對象释液,這個成員會被過濾全释。
如果數(shù)組的成員是undefined、函數(shù)或 XML 對象误债,則這些值被轉(zhuǎn)成null浸船。
正則對象會被轉(zhuǎn)成空對象。
JSON.stringify方法會忽略對象的不可遍歷屬性寝蹈。
JSON.stringify方法還可以接受一個數(shù)組李命,作為第二個參數(shù),指定需要轉(zhuǎn)成字符串的屬性箫老。只對對象的屬性有效封字,對數(shù)組無效
var obj = {
'prop1': 'value1',
'prop2': 'value2',
'prop3': 'value3'
};
var selectedProperties = ['prop1', 'prop2'];
JSON.stringify(obj, selectedProperties)
// "{"prop1":"value1","prop2":"value2"}"
第二個參數(shù)還可以是一個函數(shù),用來更改JSON.stringify的默認(rèn)行為耍鬓。
function f(key, value) {
if (typeof value === "number") {
value = 2 * value;
}
return value;
}
JSON.stringify({ a: 1, b: 2 }, f)
// '{"a": 2,"b": 4}'
JSON.stringify還可以接受第三個參數(shù)阔籽,用于增加返回的JSON字符串的可讀性。如果是數(shù)字牲蜀,表示每個屬性前面添加的空格(最多不超過10個)笆制;如果是字符串(不超過10個字符),則該字符串會添加在每行前面涣达。
JSON.stringify({ p1:1, p2:2 }, null, '|-');
/*
"{
|-"p1": 1,
|-"p2": 2
}"
*/
如果對象有自定義的toJSON方法在辆,那么JSON.stringify會使用這個方法的返回值作為參數(shù),而忽略原對象的其他屬性度苔。
var user = {
firstName: '三',
lastName: '張',
get fullName(){
return this.lastName + this.firstName;
},
toJSON: function () {
var data = {
firstName: this.firstName,
lastName: this.lastName
};
return data;
}
};
JSON.stringify(user)
// "{"firstName":"三","lastName":"張"}"
toJSON方法的一個應(yīng)用是匆篓,將正則對象自動轉(zhuǎn)為字符串。
RegExp.prototype.toJSON = RegExp.prototype.toString;
JSON.stringify(/foo/) // ""/foo/""
JSON.parse方法用于將JSON字符串轉(zhuǎn)化成對象寇窑。
var o = JSON.parse('{"name": "張三"}');
o.name // 張三