高级程序设计(第3版)第二十章JSON /笔记

JSON

语法

  • 简单值
    • 字符串、数值、布尔值和 null
    • 不支持 JavaScript中的特殊值 undefined
  • 对象
    • JSON 中的对象要求给属性加双引号 (不可写成单引号)
    • 与 JavaScript的对象字面量相比:没有声明变量;没有末尾的分号
{     
 "name": "Nicholas",  "age": 29,  "school": {  "name": "Merrimack College",  "location": "North Andover, MA"  } } 
  • 数组
    • 利用对象和数组能够创造出各种各样的数据结构
[     
 {  "title": "Professional JavaScript",  "authors": [  "Nicholas C. Zakas"  ],  edition: 3,  year: 2011  },  ]

解析与序列化

  • JSON对象
    • JavaScript的eval()函数可以解析、解释并返回 JavaScript对象和数组。
    • stringify():把 JavaScript对象序列化为 JSON字符串。
    • parse():把 JSON字符串解析为原生 JavaScript值。
var book = {  title: "Professional JavaScript"; }; var jsonText = JSON.stringify(book); 
  • 序列化选项

JSON.stringify()可以接收另外两个参数,这两个参数用于指定以不同的方式序列化 JavaScript 对象。

第一个参数是个过滤器,可以是一个数组,也可 以是一个函数;第二个参数是一个选项,表示是否在 JSON字符串中保留缩进。

    • 过滤结果
      • 如果过滤器参数是数组,那么 JSON.stringify()的结果中将只包含数组中列出的属性
      • 如果第二个参数是函数,传入的函数接收两个参数,属性(键)名和属性值。
        • 根 据属性(键)名可以知道应该如何处理要序列化的对象中的属性(字符串)。
        • 为了改变序列化对象的结果,函数返回的值就是相应键的值。
var jsonText = JSON.stringify(book, ["title", "edition"]); {"title":"Professional JavaScript","edition":3}  var jsonText = JSON.stringify(book, function(key, value){  switch(key){  case "authors":  return value.join(",")  case "year":  return 5000;  default:  return value;  } }); {"authors":"Nicholas C. Zakas","year":5000} 
    • 字符串缩进
      • var jsonText = JSON.stringify(book, null, 4); //在每个级别缩进 4个空格
      • 最大缩进空格数为 10,所有大于 10的值都会自动转换为 10
      • 如果缩进参数是一个字符串而非数值,则这个字符串将在 JSON字符串中被用作缩进字符
var jsonText = JSON.stringify(book, null, " - -");  这样,jsonText 中的字符串将变成如下所示:  {  --"title": "Professional JavaScript",  --"authors": [  ----"Nicholas C. Zakas"  --] } 
  • toJSON()方法
    • 给对象定义 toJSON()方法,返回其自身的JSON数据格式
  • 假设把一个对象传 入 JSON.stringify(),序列化该对象的顺序如下。
    • (1) 如果存在 toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
    • (2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
    • (3) 对第(2)步返回的每个值进行相应的序列化。
    • (4) 如果提供了第三个参数,执行相应的格式化。

解析选项

  • JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用。
  • 如果还原函数返回 undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插 入到结果中
var jsonText = JSON.stringify(book); var bookCopy = JSON.parse(jsonText, function(key, value){  if (key == "releaseDate"){  return new Date(value);  } else {  return value;  } });  alert(bookCopy.releaseDate.getFullYear());

你可能感兴趣的:(高级程序设计(第3版)第二十章JSON /笔记)