原文在发布在 oschina,选了几个不熟悉的记下来。
| JSON | JS 对象 | |
|---|---|---|
| 键名 | 必须为双引号 | 不加、单引号、双引号都可以 |
| 属性值 | 字符串、数值、对象、数组、布尔值、null |
都可以 |
| 逗号问题 | 最后一个属性后面不能有逗号 | 无所谓 |
| 数值 | 前导 0 不能用,小数点后必须有数字 | 没限制 |
字符串内容
除了"、\只玩的所有UNICODE字符或控制字符。
\"引号\\反斜杠\/斜杠\b终端退格\f终端换页\n换行符\r终端回车\t制表符\u4 hexadecimal digits
JSON 不是 JS 的子集
var code = '"\u2028\u2029"';
JSON.parse(code); // works fine
eval(code); // fails
这两个字符\u2028和\u2029分别表示行分隔符和段落分隔符,JSON.parse 可以正常解析,但是当做 js 解析时会报错。
JSON.stringify
不是双引号的,自动变为双引号。
最后一个属性后有逗号的,自动取掉逗号。
非数组对象顺序有可能改变。
布尔值、数字、字符串会自动转换成原始值。
new String('blah') 会变成 blah
new Number(23) 会变成 23
下面是第二个参数:
JSON.stringify({
name: "Bruce Wayne",
nick: "Batman"
}, (key, value) => {
if(key == "nick") {
return "The " + value
} else {
return value
}
}) // "{"name":"Bruce Wayne","nick":"The Batman"}"
JSON.stringify({
name: "Bruce Wayne",
nick: "Batman"
}, ["phone", "nick"]
) // "{"nick":"Batman"}"
第三个参数为美化用。
JSON.parse
将合法JSONString解析为JS对象。
可选的第二个参数可以定义一个在解析后对将要返回的JS对象进行操作的函数。
Object.toJSON
重写这个方法返回一个对象的时候,JSON.stringify就变了:
var info={
"msg":"I Love You",
"toJSON":function(){
var replaceMsg=new Object()
replaceMsg["msg"]="Go Die"
return replaceMsg
}
}
JSON.stringify(info) // "{"msg":"Go Die"}"