转载

Json杂谈系列------(一)初始json

1. JSON 是什么

JSON,全称是 JavaScript Object Notation,即 JavaScript 对象标记法。这是一种 轻量级 (Light-Weight)、 基于文本的 (Text-Based)、 可读的 (Human-Readable)格式。

JSON 的名称中虽然带有 JavaScript,但这是指其语法规则是参考 JavaScript 对象的,而不是指只能用于 JavaScript 语言。实际上很多语言(如 C++、Java、PHP 等)都配有 JSON 的解析和生成器。

JSON 无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比 XML (另一种常见的数据交换格式),文件更小,因此迅速成为网络上十分流行的交换格式。

2. JSON 的语法规则

  1. 数组(Array)用方括号(“[]”)表示。
  2. 对象(Object)用大括号(”{}”)表示。
  3. 名称/值对(name/value)之间用冒号(”:”)隔开。
  4. 名称(name)置于双引号中,值(value)有字符串、数值、布尔值、null、对象和数组。
  5. 并列的数据之间用逗号(“,”)分隔
  6. 数组或对象的每个成员的值,可以是简单值,也可以是复合值

需要注意的是,空数组和空对象都是合格的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 和 XML

JSON 常被拿来与 XML 做比较,因为 JSON 的诞生本来就多多少少要有取代 XML 的意思。相比 XML,JSON 的优势如下:

  • 没有结束标签,长度更短,读写更快
  • 能够直接被 JavaScript 解释器解析
  • 可以使用数组

下面是描述同样信息的 XML 文件和 JSON 文件,来看看区别。JSON:

{     "name": "Geoff Lui",     "age": 26,     "isChinese": true,     "friends":["Lucy", "Lily", "Gwen"] }

XML:

<root>  <name>Geoff Lui</name>  <age>Geoff Lui</age>  <friends>Lucy</friends>  <friends>Lily</friends>  <friends>Gwen</friends> </root> 

可以看到,描述同样的信息,XML 更加麻烦,而 JSON 要轻巧得多,在有数组出现的情况下更加明显。而且,当数组项很多的时候,XML 文件中的大量信息都被用于描述没什么用的标签上了。

但是,绝不是说 XML 就一无是处,要完全放弃,归根结底还是要看有怎样的开发要求。

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、函数或XML对象,这个成员会被省略。如果数组的成员是undefined、函数或XML对象,则这些值被转成null。

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') // true JSON.parse('"foo"') // "foo" JSON.parse('[1, 5, "false"]') // [1, 5, "false"] JSON.parse('null') // null  var 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 // 11 o.b // undefined
  1. 参考链接: JSON.parse()
  2. 阮一峰的教程
正文到此结束
Loading...