JSON格式
复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和
null
(不能使用NaN
,Infinity
,-Infinity
和undefined
)。字符串必须使用双引号表示,不能使用单引号。
对象的键名必须放在双引号里面。
数组或对象最后一个成员的后面,不能加逗号。
注意,
null
、空数组和空对象都是合法的 JSON 值。
以下是合法的 JSON。
1 | ["one", "two", "three"] |
以下是不合法的 JSON。
1 | { name: "张三", 'age': 32 } // 属性名必须使用双引号 |
JSON 对象
JSON
对象是 JavaScript 的原生对象,用来处理 JSON 格式数据。它有两个静态方法:JSON.stringify()
和JSON.parse()
。
JSON.stringify()
JSON.stringify
方法用于将一个值转为字符串。该字符串符合 JSON 格式,并且可以被JSON.parse
方法还原。
1 | JSON.stringify('abc') // ""abc"" |
上面代码将各种类型的值,转成 JSON 字符串。
需要注意的是,对于原始类型的字符串,转换结果会带双引号。
1 | JSON.stringify('foo') === "foo" // false |
上面代码中,字符串foo
,被转成了""foo""
。这是因为将来还原的时候,双引号可以让 JavaScript 引擎知道,foo
是一个字符串,而不是一个变量名。
如果原始对象中,有一个成员的值是undefined
、函数或 XML 对象,这个成员会被过滤。
1 | var obj = { |
上面代码中,对象obj
的a
属性是undefined
,而b
属性是一个函数,结果都被JSON.stringify
过滤。
如果数组的成员是undefined
、函数或 XML 对象,则这些值被转成null
。
1 | var arr = [undefined, function () {}]; |
上面代码中,数组arr
的成员是undefined
和函数,它们都被转成了null
。
正则对象会被转成空对象。
1 | JSON.stringify(/foo/) // "{}" |
JSON.stringify
方法会忽略对象的不可遍历属性。
JSON.parse()
JSON.parse
方法用于将JSON字符串转化成对象。
1 | JSON.parse('{}') // {} |
如果传入的字符串不是有效的JSON格式,JSON.parse
方法将报错。
1 | JSON.parse("'String'") // illegal single quotes |
上面代码中,双引号字符串中是一个单引号字符串,因为单引号字符串不符合JSON格式,所以报错。
JavaScript 对象和 JSON 的关系
JavaScript 对象的字面量写法只是长的像 JSON 格式数据,二者属于不同的范畴,JavaScript 对象中很多类型(函数、正则、Date) JSON 格式的规范并不支持,JavaScript 对象的字面量写法更宽松。