关于JSON

1. JSON 对象

es5 定义了全局对象 JSON。
支持的浏览器有 IE8+ 、Firefox 3.5+ 、Safari 4+、Chrome、Opera 10.5+

2. JSON.stringify()

JSON.stringify() 除了接受要序列化的对象外,还可以接受另外两个参数。
第一个参数是一个过滤器,可以是一个数组或函数,第二个参数是一个选项,表示是否在JSON字符串中保留缩进。
如:

var book = {
  title: 'Professional JS',
  authors: ['abc', 'def'],
  edition: 3,
  year: 2011
}

第一个参数是数组

var jsonText1 = JSON.stringify(book, ['title', 'edition'])
console.log(jsonText1) // '{"title":"Professional JS","edition":3}'

第一个参数是函数

var jsonText2 = JSON.stringify(book, function (key, value) {
  switch (key) {
    case 'authors':
      return value.join(',');
    case 'year':
      return 2016;
    case 'edition':
      return undefined;
    default:
      return value;
  }
})
console.log(jsonText2) // '{"title":"Professional JS","authors":"abc,def","year":2016}'

第二个参数用于控制结果中的缩进和空白符。
如果是数值,则表示每个级别缩进的空格数,最大10,超过10 的值自动转换成10。
如果是字符串,则用作缩进字符。字符串长度超过10,结果中将只出现前10个字符。
会在结果字符串中插入换行符提高可读性。
如:

var jsonText3 = JSON.stringify(book, null, 6)
console.log(jsonText3)
// '{
//       "title": "Professional JS",
//       "authors": [
//             "abc",
//             "def"
//       ],
//       "edition": 3,
//       "year": 2011
// }'
var jsonText4 = JSON.stringify(book, null, '--')
console.log(jsonText4)
// '{
// --"title": "Professional JS",
// --"authors": [
// ----"abc",
// ----"def"
// --],
// --"edition": 3,
// --"year": 2011
// }'

3. toJSON() 方法

可以给对象定义 toJSON() 方法,返回自身的 JSON 数据格式,此方法优先级最高
如:

var book = {
  title: 'Professional JS',
  authors: ['abc', 'def'],
  edition: 3,
  year: 2011,
  toJSON: function () {
    return {
      name: 'wfc'
    }
  }
}
var jsonText = JSON.stringify(book, null, 1)
console.log(jsonText)
// '{
//  "name": "wfc"
// }'

注意: JSON.stringify() 处理的优先级为 toJSON() => 第二个参数 => 第三个参数。

4. JSON.parse()

JSON.parse() 接受另一个参数,该参数是一个函数,将在每个健值对上采用,类似于 JSON.stringify() 的过滤函数。
如:

var book = {
  title: 'Professional JS',
  authors: ['abc', 'def'],
  edition: 3,
  year: 2011,
  releaseDate: new Date(2016,11,22)
}
var jsonText = JSON.stringify(book, null, 1)
console.log(jsonText)
// '
// json.html:48 {
//  "title": "Professional JS",
//  "authors": [
//   "abc",
//   "def"
//  ],
//  "edition": 3,
//  "year": 2011,
//  "releaseDate": "2016-12-21T16:00:00.000Z"
// }'
var copyBook = JSON.parse(jsonText, function (key, value) {
  if (key === 'releaseDate') {
    console.log(value) // '2016-12-21T16:00:00.000Z'
    return new Date(value)
  } else {
    return value
  }
})

JSON部分结束


wfc_666
643 声望31 粉丝

专注全栈