å设æä»¬æä¸ä¸ªå¤æçå¯¹è±¡ï¼æä»¬å¸æå°å ¶è½¬æ¢ä¸ºå符串ï¼ä»¥éè¿ç½ç»åéï¼æè åªæ¯ä¸ºäºå¨æ¥å¿ä¸è¾åºå®ã
å½ç¶ï¼è¿æ ·çå符串åºè¯¥å 嫿æéè¦ç屿§ã
æä»¬å¯ä»¥åè¿æ ·å®ç°è½¬æ¢ï¼
let user = {
name: "John",
age: 30,
toString() {
return `{name: "${this.name}", age: ${this.age}}`;
}
};
alert(user); // {name: "John", age: 30}
â¦â¦ä½å¨å¼åè¿ç¨ä¸ï¼ä¼æ°å¢ä¸äºå±æ§ï¼æ§ç屿§ä¼è¢«éå½ååå é¤ãæ¯æ¬¡æ´æ°è¿ç§ toString é½ä¼é常çè¦ãæä»¬å¯ä»¥å°è¯éåå
¶ä¸ç屿§ï¼ä½æ¯å¦æå¯¹è±¡å¾å¤æï¼å¹¶ä¸å¨å±æ§ä¸åµå¥äºå¯¹è±¡å¢ï¼æä»¬ä¹éè¦å¯¹å®ä»¬è¿è¡è½¬æ¢ã
幸è¿çæ¯ï¼ä¸éè¦ç¼åä»£ç æ¥å¤çææè¿äºé®é¢ãè¿é¡¹ä»»å¡å·²ç»è§£å³äºã
JSON.stringify
JSONï¼JavaScript Object Notationï¼æ¯è¡¨ç¤ºå¼å对象çéç¨æ ¼å¼ãå¨ RFC 4627 æ åä¸æå¯¹å ¶çæè¿°ãæå宿¯ä¸º JavaScript èå建çï¼ä½è®¸å¤å ¶ä»ç¼ç¨è¯è¨ä¹æç¨äºå¤çå®çåºãå æ¤ï¼å½å®¢æ·ç«¯ä½¿ç¨ JavaScript èæå¡å¨ç«¯æ¯ä½¿ç¨ Ruby/PHP/Java çè¯è¨ç¼åçæ¶ï¼ä½¿ç¨ JSON å¯ä»¥å¾å®¹æå°è¿è¡æ°æ®äº¤æ¢ã
JavaScript æä¾äºå¦ä¸æ¹æ³ï¼
JSON.stringifyå°å¯¹è±¡è½¬æ¢ä¸º JSONãJSON.parseå° JSON 转æ¢å对象ã
ä¾å¦ï¼å¨è¿éæä»¬ JSON.stringify ä¸ä¸ª student 对象ï¼
let student = {
name: 'John',
age: 30,
isAdmin: false,
courses: ['html', 'css', 'js'],
spouse: null
};
let json = JSON.stringify(student);
alert(typeof json); // we've got a string!
alert(json);
/* JSON ç¼ç ç对象ï¼
{
"name": "John",
"age": 30,
"isAdmin": false,
"courses": ["html", "css", "js"],
"spouse": null
}
*/
æ¹æ³ JSON.stringify(student) æ¥æ¶å¯¹è±¡å¹¶å°å
¶è½¬æ¢ä¸ºå符串ã
å¾å°ç json å符串æ¯ä¸ä¸ªè¢«ç§°ä¸º JSON ç¼ç ï¼JSON-encodedï¼ æ åºååï¼serializedï¼ æ å符串åï¼stringifiedï¼ æ ç¼ç»åï¼marshalledï¼ ç对象ãæä»¬ç°å¨å·²ç»åå¤å¥½éè¿æçº¿åé宿å°å
¶æ¾å
¥æ®éæ°æ®åå¨ã
请注æï¼JSON ç¼ç ç对象ä¸å¯¹è±¡åé¢éæå 个éè¦çåºå«ï¼
- å符串使ç¨åå¼å·ãJSON 䏿²¡æåå¼å·æåå¼å·ãæä»¥
'John'被转æ¢ä¸º"John"ã - å¯¹è±¡å±æ§åç§°ä¹æ¯åå¼å·çãè¿æ¯å¼ºå¶æ§çãæä»¥
age:30è¢«è½¬æ¢æ"age":30ã
JSON.stringify ä¹å¯ä»¥åºç¨äºåå§ï¼primitiveï¼æ°æ®ç±»åã
JSON æ¯æä»¥ä¸æ°æ®ç±»åï¼
- Objects
{ ... } - Arrays
[ ... ] - Primitivesï¼
- stringsï¼
- numbersï¼
- boolean values
true/falseï¼ nullã
ä¾å¦ï¼
// æ°åå¨ JSON è¿æ¯æ°å
alert( JSON.stringify(1) ) // 1
// åç¬¦ä¸²å¨ JSON ä¸è¿æ¯å符串ï¼åªæ¯è¢«åå¼å·æ©èµ·æ¥
alert( JSON.stringify('test') ) // "test"
alert( JSON.stringify(true) ); // true
alert( JSON.stringify([1, 2, 3]) ); // [1,2,3]
JSON æ¯è¯è¨æ å
³ççº¯æ°æ®è§èï¼å æ¤ä¸äºç¹å®äº JavaScript çå¯¹è±¡å±æ§ä¼è¢« JSON.stringify è·³è¿ã
å³ï¼
- 彿°å±æ§ï¼æ¹æ³ï¼ã
- Symbol ç±»åçé®åå¼ã
- åå¨
undefinedç屿§ã
let user = {
sayHi() { // 被忽ç¥
alert("Hello");
},
[Symbol("id")]: 123, // 被忽ç¥
something: undefined // 被忽ç¥
};
alert( JSON.stringify(user) ); // {}ï¼ç©ºå¯¹è±¡ï¼
é常è¿å¾å¥½ã妿è¿ä¸æ¯æä»¬æ³è¦çæ¹å¼ï¼é£ä¹æä»¬å¾å¿«å°±ä¼çå°å¦ä½èªå®ä¹è½¬æ¢æ¹å¼ã
ææ£çæ¯æ¯æåµå¥å¯¹è±¡è½¬æ¢ï¼å¹¶ä¸å¯ä»¥èªå¨å¯¹å ¶è¿è¡è½¬æ¢ã
ä¾å¦ï¼
let meetup = {
title: "Conference",
room: {
number: 23,
participants: ["john", "ann"]
}
};
alert( JSON.stringify(meetup) );
/* æ´ä¸ªç»æé½è¢«å符串åäº
{
"title":"Conference",
"room":{"number":23,"participants":["john","ann"]},
}
*/
éè¦çéå¶ï¼ä¸å¾æå¾ªç¯å¼ç¨ã
ä¾å¦ï¼
let room = {
number: 23
};
let meetup = {
title: "Conference",
participants: ["john", "ann"]
};
meetup.place = room; // meetup å¼ç¨äº room
room.occupiedBy = meetup; // room å¼ç¨äº meetup
JSON.stringify(meetup); // Error: Converting circular structure to JSON
å¨è¿éï¼è½¬æ¢å¤±è´¥äºï¼å 为循ç¯å¼ç¨ï¼room.occupiedBy å¼ç¨äº meetupï¼meetup.place å¼ç¨äº roomï¼
æé¤å转æ¢ï¼replacer
JSON.stringify ç宿´è¯æ³æ¯ï¼
let json = JSON.stringify(value[, replacer, space])
- value
- è¦ç¼ç çå¼ã
- replacer
- è¦ç¼ç ç屿§æ°ç»ææ å°å½æ°
function(key, value)ã - space
- ç¨äºæ ¼å¼åçç©ºæ ¼æ°éã
大é¨åæ
åµï¼JSON.stringify ä»
ä¸ç¬¬ä¸ä¸ªåæ°ä¸èµ·ä½¿ç¨ã使¯ï¼å¦ææä»¬éè¦å¾®è°æ¿æ¢è¿ç¨ï¼æ¯å¦è¿æ»¤æå¾ªç¯å¼ç¨ï¼æä»¬å¯ä»¥ä½¿ç¨ JSON.stringify ç第äºä¸ªåæ°ã
妿æä»¬ä¼ éä¸ä¸ªå±æ§æ°ç»ç»å®ï¼é£ä¹åªæè¿äºå±æ§ä¼è¢«ç¼ç ã
ä¾å¦ï¼
let room = {
number: 23
};
let meetup = {
title: "Conference",
participants: [{name: "John"}, {name: "Alice"}],
place: room // meetup å¼ç¨äº room
};
room.occupiedBy = meetup; // room å¼ç¨äº meetup
alert( JSON.stringify(meetup, ['title', 'participants']) );
// {"title":"Conference","participants":[{},{}]}
è¿éæä»¬å¯è½è¿äºä¸¥æ ¼äºã屿§å表åºç¨äºäºæ´ä¸ªå¯¹è±¡ç»æãæä»¥ participants æ¯ç©ºçï¼å 为 name ä¸å¨å表ä¸ã
让æä»¬å
å«é¤äºä¼å¯¼è´å¾ªç¯å¼ç¨ç room.occupiedBy ä¹å¤çææå±æ§ï¼
let room = {
number: 23
};
let meetup = {
title: "Conference",
participants: [{name: "John"}, {name: "Alice"}],
place: room // meetup å¼ç¨äº room
};
room.occupiedBy = meetup; // room å¼ç¨äº meetup
alert( JSON.stringify(meetup, ['title', 'participants', 'place', 'name', 'number']) );
/*
{
"title":"Conference",
"participants":[{"name":"John"},{"name":"Alice"}],
"place":{"number":23}
}
*/
ç°å¨ï¼é¤ occupiedBy 以å¤çææå
容é½è¢«åºååäºã使¯å±æ§çå表太é¿äºã
幸è¿çæ¯ï¼æä»¬å¯ä»¥ä½¿ç¨ä¸ä¸ªå½æ°ä»£æ¿æ°ç»ä½ä¸º replacerã
è¯¥å½æ°ä¼ä¸ºæ¯ä¸ª (key,value) 对è°ç¨å¹¶è¿åâå·²æ¿æ¢âçå¼ï¼è¯¥å¼å°æ¿æ¢åæçå¼ã妿å¼è¢«è·³è¿äºï¼å为 undefinedã
卿们çä¾åä¸ï¼æä»¬å¯ä»¥ä¸º occupiedBy 以å¤çææå
容æåæ ·è¿å valueãå¯¹äº occupiedByï¼ä¸é¢ç代ç è¿å undefinedï¼
let room = {
number: 23
};
let meetup = {
title: "Conference",
participants: [{name: "John"}, {name: "Alice"}],
place: room // meetup å¼ç¨äº room
};
room.occupiedBy = meetup; // room å¼ç¨äº meetup
alert( JSON.stringify(meetup, function replacer(key, value) {
alert(`${key}: ${value}`);
return (key == 'occupiedBy') ? undefined : value;
}));
/* key:value pairs that come to replacer:
: [object Object]
title: Conference
participants: [object Object],[object Object]
0: [object Object]
name: John
1: [object Object]
name: Alice
place: [object Object]
number: 23
occupiedBy: [object Object]
*/
请注æ replacer 彿°ä¼è·åæ¯ä¸ªé®/å¼å¯¹ï¼å
æ¬åµå¥å¯¹è±¡åæ°ç»é¡¹ãå®è¢«éå½å°åºç¨ãreplacer ä¸ç this ç弿¯å
å«å½å屿§ç对象ã
第ä¸ä¸ªè°ç¨å¾ç¹å«ã宿¯ä½¿ç¨ç¹æ®çâå
è£
对象âå¶ä½çï¼{"": meetup}ãæ¢å¥è¯è¯´ï¼ç¬¬ä¸ä¸ª (key, value) 对ç鮿¯ç©ºçï¼å¹¶ä¸è¯¥å¼æ¯æ´ä¸ªç®æ 对象ãè¿å°±æ¯ä¸é¢ç示ä¾ä¸ç¬¬ä¸è¡æ¯ ":[object Object]" çåå ã
è¿ä¸ªç念æ¯ä¸ºäºç» replacer æä¾å°½å¯è½å¤çåè½ï¼å¦ææå¿
è¦ï¼å®ææºä¼åæå¹¶æ¿æ¢/è·³è¿æ´ä¸ªå¯¹è±¡ã
æ ¼å¼åï¼space
JSON.stringify(value, replacer, spaces) ç第ä¸ä¸ªåæ°æ¯ç¨äºä¼åæ ¼å¼çç©ºæ ¼æ°éã
以åï¼ææå符串åçå¯¹è±¡é½æ²¡æç¼©è¿åé¢å¤çç©ºæ ¼ã妿æä»¬æ³éè¿ç½ç»åéä¸ä¸ªå¯¹è±¡ï¼é£å°±æ²¡ä»ä¹é®é¢ãspace åæ°ä¸é¨ç¨äºè°æ´åºæ´ç¾è§çè¾åºã
è¿éç space = 2 åè¯ JavaScript å¨å¤è¡ä¸æ¾ç¤ºåµå¥ç对象ï¼å¯¹è±¡å
é¨ç¼©è¿ 2 ä¸ªç©ºæ ¼ï¼
let user = {
name: "John",
age: 25,
roles: {
isAdmin: false,
isEditor: true
}
};
alert(JSON.stringify(user, null, 2));
/* ä¸¤ä¸ªç©ºæ ¼ç缩è¿ï¼
{
"name": "John",
"age": 25,
"roles": {
"isAdmin": false,
"isEditor": true
}
}
*/
/* å¯¹äº JSON.stringify(user, null, 4) çç»æä¼ææ´å¤ç¼©è¿ï¼
{
"name": "John",
"age": 25,
"roles": {
"isAdmin": false,
"isEditor": true
}
}
*/
第ä¸ä¸ªåæ°ä¹å¯ä»¥æ¯å符串ãå¨è¿ç§æ åµä¸ï¼å符串ç¨äºç¼©è¿ï¼è䏿¯ç©ºæ ¼çæ°éã
spaces åæ°ä»
ç¨äºæ¥å¿è®°å½åç¾åè¾åºã
èªå®ä¹ âtoJSONâ
å toString è¿è¡å符串转æ¢ï¼å¯¹è±¡ä¹å¯ä»¥æä¾ toJSON æ¹æ³æ¥è¿è¡ JSON 转æ¢ã妿å¯ç¨ï¼JSON.stringify ä¼èªå¨è°ç¨å®ã
ä¾å¦ï¼
let room = {
number: 23
};
let meetup = {
title: "Conference",
date: new Date(Date.UTC(2017, 0, 1)),
room
};
alert( JSON.stringify(meetup) );
/*
{
"title":"Conference",
"date":"2017-01-01T00:00:00.000Z", // (1)
"room": {"number":23} // (2)
}
*/
å¨è¿å¿æä»¬å¯ä»¥çå° date (1) åæäºä¸ä¸ªå符串ãè¿æ¯å ä¸ºæææ¥æé½æä¸ä¸ªå
建ç toJSON æ¹æ³æ¥è¿åè¿ç§ç±»åçå符串ã
ç°å¨è®©æä»¬ä¸ºå¯¹è±¡ room æ·»å ä¸ä¸ªèªå®ä¹ç toJSONï¼
let room = {
number: 23,
toJSON() {
return this.number;
}
};
let meetup = {
title: "Conference",
room
};
alert( JSON.stringify(room) ); // 23
alert( JSON.stringify(meetup) );
/*
{
"title":"Conference",
"room": 23
}
*/
æ£å¦æä»¬æçå°çï¼toJSON æ¢å¯ä»¥ç¨äºç´æ¥è°ç¨ JSON.stringify(room) ä¹å¯ä»¥ç¨äºå½ room åµå¥å¨å¦ä¸ä¸ªç¼ç å¯¹è±¡ä¸æ¶ã
JSON.parse
è¦è§£ç JSON åç¬¦ä¸²ï¼æä»¬éè¦å¦ä¸ä¸ªæ¹æ³ JSON.parseã
è¯æ³ï¼
let value = JSON.parse(str, [reviver]);
- str
- è¦è§£æç JSON å符串ã
- reviver
- å¯éç彿° function(key,value)ï¼è¯¥å½æ°å°ä¸ºæ¯ä¸ª
(key, value)对è°ç¨ï¼å¹¶å¯ä»¥å¯¹å¼è¿è¡è½¬æ¢ã
ä¾å¦ï¼
// åç¬¦ä¸²åæ°ç»
let numbers = "[0, 1, 2, 3]";
numbers = JSON.parse(numbers);
alert( numbers[1] ); // 1
对äºåµå¥å¯¹è±¡ï¼
let userData = '{ "name": "John", "age": 35, "isAdmin": false, "friends": [0,1,2,3] }';
let user = JSON.parse(userData);
alert( user.friends[1] ); // 1
JSON å¯è½ä¼é叏夿ï¼å¯¹è±¡åæ°ç»å¯ä»¥å å«å ¶ä»å¯¹è±¡åæ°ç»ã使¯å®ä»¬å¿ é¡»éµå¾ªç¸åç JSON æ ¼å¼ã
以䏿¯æå JSON æ¶çå ¸åéè¯¯ï¼ææ¶æä»¬å¿ é¡»åºäºè°è¯ç®çç¼åå®ï¼ï¼
let json = `{
name: "John", // é误ï¼å±æ§å没æåå¼å·
"surname": 'Smith', // é误ï¼å¼ä½¿ç¨çæ¯åå¼å·ï¼å¿
须使ç¨åå¼å·ï¼
'isAdmin': false // é误ï¼é®ä½¿ç¨çæ¯åå¼å·ï¼å¿
须使ç¨åå¼å·ï¼
"birthday": new Date(2000, 2, 3), // é误ï¼ä¸å
è®¸ä½¿ç¨ "new"ï¼åªè½æ¯è£¸å¼
"friends": [0,1,2,3] // è¿ä¸ªæ²¡é®é¢
}`;
æ¤å¤ï¼JSON 䏿¯ææ³¨éãå JSON æ·»å æ³¨éæ æã
è¿æå¦ä¸ç§å为 JSON5 çæ ¼å¼ï¼å®å 许æªå å¼å·çé®ï¼ä¹å 许注éçãä½è¿æ¯ä¸ä¸ªç¬ç«çåºï¼ä¸å¨è¯è¨çè§èä¸ã
æ å JSON æ ¼å¼ä¹æä»¥å¦æ¤ä¸¥æ ¼ï¼å¹¶ä¸æ¯å 为å®çå¶å®è 们巿ï¼èæ¯ä¸ºäºè½å¤ç®åï¼å¯é ä¸å¿«éå°å®ç°è§£æç®æ³ã
ä½¿ç¨ reviver
æ³è±¡ä¸ä¸ï¼æä»¬ä»æå¡å¨ä¸è·å¾äºä¸ä¸ªå符串åç meetup 对象ã
å®çèµ·æ¥åè¿æ ·ï¼
// title: (meetup title), date: (meetup date)
let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
â¦â¦ç°å¨æä»¬éè¦å¯¹å®è¿è¡ ååºåï¼deserializeï¼ï¼æå®è½¬æ¢å JavaScript 对象ã
让æä»¬éè¿è°ç¨ JSON.parse æ¥å®æï¼
let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
let meetup = JSON.parse(str);
alert( meetup.date.getDate() ); // Error!
åï¼æ¥éäºï¼
meetup.date ç弿¯ä¸ä¸ªå符串ï¼è䏿¯ Date 对象ãJSON.parse æä¹ç¥éåºè¯¥å°å符串转æ¢ä¸º Date å¢ï¼
让æä»¬å° reviver 彿°ä¼ éç» JSON.parse ä½ä¸ºç¬¬äºä¸ªåæ°ï¼è¯¥å½æ°æç
§âåæ ·âè¿åææå¼ï¼ä½æ¯ date ä¼åæ Dateï¼
let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
let meetup = JSON.parse(str, function(key, value) {
if (key == 'date') return new Date(value);
return value;
});
alert( meetup.date.getDate() ); // ç°å¨æ£å¸¸è¿è¡äºï¼
顺便说ä¸ä¸ï¼è¿ä¹éç¨äºåµå¥å¯¹è±¡ï¼
let schedule = `{
"meetups": [
{"title":"Conference","date":"2017-11-30T12:00:00.000Z"},
{"title":"Birthday","date":"2017-04-18T12:00:00.000Z"}
]
}`;
schedule = JSON.parse(schedule, function(key, value) {
if (key == 'date') return new Date(value);
return value;
});
alert( schedule.meetups[1].date.getDate() ); // æ£å¸¸è¿è¡äºï¼
æ»ç»
- JSON æ¯ä¸ç§æ°æ®æ ¼å¼ï¼å ·æèªå·±çç¬ç«æ åå大夿°ç¼ç¨è¯è¨çåºã
- JSON æ¯æ objectï¼arrayï¼stringï¼numberï¼boolean å
nullã - JavaScript æä¾åºååï¼serializeï¼æ JSON çæ¹æ³ JSON.stringify åè§£æ JSON çæ¹æ³ JSON.parseã
- è¿ä¸¤ç§æ¹æ³é½æ¯æç¨äºæºè½è¯»/åç转æ¢å½æ°ã
- 妿ä¸ä¸ªå¯¹è±¡å
·æ
toJSONï¼é£ä¹å®ä¼è¢«JSON.stringifyè°ç¨ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼