高级程序设计(第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());
posted @ 2020-07-27 19:40  isremya  阅读(115)  评论(0)    收藏  举报