原文在发布在 oschina,选了几个不熟悉的记下来。
JSON | JS 对象 | |
---|---|---|
键名 | 必须为双引号 | 不加、单引号、双引号都可以 |
属性值 | 字符串、数值、对象、数组、布尔值、null |
都可以 |
逗号问题 | 最后一个属性后面不能有逗号 | 无所谓 |
数值 | 前导 0 不能用,小数点后必须有数字 | 没限制 |
字符串内容
除了"
、\
只玩的所有UNICODE
字符或控制字符。
\"
引号\\
反斜杠\/
斜杠\b
终端退格\f
终端换页\n
换行符\r
终端回车\t
制表符\u
4 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"}"