JSON,全称是 JavaScript Object Notation,即 JavaScript 对象标记法。这是一种轻量级(Light-Weight)、基于文本的(Text-Based)、可读的(Human-Readable)格式。
JSON 的名称中虽然带有 JavaScript,但这是指其语法规则是参考 JavaScript 对象的,而不是指只能用于 JavaScript 语言。实际上很多语言(如 C++、Java、PHP 等)都配有 JSON 的解析和生成器。
JSON 无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比
2. JSON 的语法规则
- 数组(Array)用方括号(“[]”)表示。
- 对象(Object)用大括号(”{}”)表示。
- 名称/值对(name/value)之间用冒号(”:”)隔开。
- 名称(name)置于双引号中,值(value)有字符串、数值、布尔值、null、对象和数组。
- 并列的数据之间用逗号(“,”)分隔
- 数组或对象的每个成员的值,可以是简单值,也可以是复合值
需要注意的是,空数组和空对象都是合格的JSON值,null本身也是一个合格的JSON值。
简单案例:
//描述学生信息的案例{ "name":"zhangsan", "age":23, "sex":"male", "class":"Computer Science", "studentNumber":"20120101", course:[ {courseNo:"2015001","courseName":"数据结构",teacherName":"Lisi"}, {courseNo:"2015002","courseName":"数据库原理",teacherName":"Wangwu"} ]}
3. JSON 和
JSON 常被拿来与
- 没有结束标签,长度更短,读写更快
- 能够直接被 JavaScript 解释器解析
- 可以使用数组
下面是描述同样信息的
{ "name": "Geoff Lui", "age": 26, "isChinese": true, "friends":["Lucy", "Lily", "Gwen"]}
<root> <name>Geoff Lui</name> <age>Geoff Lui</age> <friends>Lucy</friends> <friends>Lily</friends> <friends>Gwen</friends></root>
可以看到,描述同样的信息,
但是,绝不是说
4.JSON对象
处理JSON格式的数据。它有两个方法:JSON.stringify和JSON.parse。
4.1、stringify()
JSON.stringify方法用于将一个值转为字符串。该字符串符合JSON格式,并且可以被JSON.parse方法还原。
JSON.stringify("somestring") // "somestring"JSON.stringify(1) // "1"JSON.stringify(false) // "false"JSON.stringify([]) // "[]"JSON.stringify({}) // "{}"JSON.stringify([1, "false", false])// '[1,"false",false]'JSON.stringify({ "name": "张三" })// '{"name":"张三"}'
需要注意的是,对于原始类型的字符串,转换结果会带双引号,即字符串somestring会被转成"somestring"
,这是因为将来还原的时候,双引号可以让JavaScript引擎知道,abc是一个字符串,而不是一个变量名。
如果原始对象中,有一个成员的值是undefined、函数或
JSON.stringify({ f : function () {}, a : [function () {}, undefined]});// "{"a":[null,null]}"
JSON.stringify方**忽略对象的不可遍历属性。
var obj = {};Object.defineProperties(obj, { 'foo': { value: 1, enumerable: true }, 'bar': { value: 2, enumerable: false }});JSON.stringify(obj); // {"foo":1}
JSON.stringify方法还可以接受一个数组参数,指定需要转成字符串的属性。
console.log(JSON.stringify({ name:"zhangsan", age:22 }, ['name'])); // {"name":"zhangsan"}
JSON.stringify方法还可以接受一个函数作为参数,用来更改默认的字符串化的行为。
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还可以接受第三个参数,用于增加返回的JSON字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。
JSON.stringify({ p1:1, p2:2 }, null, 2);// "{ "p1": 1, "p2": 2}"JSON.stringify({ p1:1, p2:2 }, null, "|-");// "{|-"p1": 1,|-"p2": 2}"
如果JSON.stringify方法处理的对象,包含一个toJSON方法,则它会使用这个方法得到一个值,然后再将这个值转成字符串,而忽略其他成员。
JSON.stringify({ toJSON: function() { return "Cool" }})// "Cool""var o = { foo: 'foo', toJSON: function() { return 'bar'; }};var json = JSON.stringify({x: o}); // '{"x":"bar"}'
toJSON方法的一个应用是,可以将正则对象自动转为字符串。
RegExp.prototype.toJSON = RegExp.prototype.toString;JSON.stringify(/foo/)// "/foo/"
4.2、JSON.parse()
JSON.parse方法用于将JSON字符串转化成对象。
JSON.parse('{}') // {}JSON.parse('true') // trueJSON.parse('"foo"') // "foo"JSON.parse('[1, 5, "false"]') // [1, 5, "false"]JSON.parse('null') // nullvar o = JSON.parse('{"name":"张三"}');o.name // 张三
如果传入的字符串不是有效的JSON格式,JSON.parse方法将报错。为了处理解析错误,可以将JSON.parse方法放在try...catch代码块中。
JSON.parse方法可以接受一个处理函数,用法与JSON.stringify方法类似。
function f(key, value) { if ( key === ""){ return value; } if ( key === "a" ) { return value + 10; }}var o = JSON.parse('{"a":1,"b":2}', f);o.a // 11o.b // undefined
- 参考链接:JSON.parse()
- 阮一峰的教程
原标题:Json杂谈系列
关键词:JS