zoukankan      html  css  js  c++  java
  • JavaScript高级程序设计学习笔记第二十章--JSON

    1.JSON:JavaScript Object Notation, JavaScript 对象表示法。

    2.最重要的是要理解它是一种数据格式,不是一种编程语言。虽然具有相同的语法形式,但 JSON 并不从属于 JavaScript。而且,并不是只有 JavaScript 才使用 JSON,毕竟 JSON 只是一种数据格式。很多编程语言都有针对 JSON 的解析器和序列化器。

    3.语法:

    JSON 的语法可以表示以下三种类型的值:

    • 简单值:使用与 JavaScript 相同的语法,可以在 JSON 中表示字符串、数值、布尔值和 null。但 JSON 不支持 JavaScript 中的特殊值 undefined。

      • JavaScript 字符串与 JSON 字符串的最大区别在于, JSON 字符串必须使用双引号(单引号会导致语法错误)。
    • 对象:对象作为一种复杂数据类型,表示的是一组无序的键值对儿。而每个键值对儿中的值可以是简单值,也可以是复杂数据类型的值。

      • 与 JavaScript 的对象字面量相比, JSON 对象有两个地方不一样。首先,没有声明变量(JSON 中没有变量的概念)。其次,没有末尾的分号(因为这不是 JavaScript 语句,所以不需要分号)。再说一遍,对象的属性必须加双引号,这在 JSON 中是必需的。属性的值可以是简单值,也可以是复杂类型值。例如:
      •  1 //javascript对象字面量
         2 var person = {
         3 name: "Nicholas",
         4 age: 29
         5 };
         6 //JSON变量
         7 {
         8 "name": "Nicholas",
         9 "age": 29
        10 }
    • 数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组。

      • JSON 数组没有变量和分号,例如:
      • 1 //JavaScript 中的数组字面量
        2 var values = [25, "hi", true];
        3 
        4 //JSON表示数组
        5 [25, "hi", true]
    • JSON 不支持变量、函数或对象实例

    解析与序列化:

    JSON 之所以流行,更重要的一个原因是,可以把JSON 数据结构解析为有用的 JavaScript 对象。

    JSON 对象有两个方法: stringify()和 parse()。在最简单的情况下,这两个方法分别用于把JavaScript 对象序列化为 JSON 字符串和把 JSON 字符串解析为原生 JavaScript 值。

    序列化:

    例如:

     1 var book = {
     2 title: "Professional JavaScript",
     3 authors: [
     4 "Nicholas C. Zakas"
     5 ],
     6 edition: 3,
     7 year: 2011
     8 };
     9 var jsonText = JSON.stringify(book);//{"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3,
    10 "year":2011}

    在序列化 JavaScript 对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。此外,值为undefined 的任何属性也都会被跳过。

    实际上, JSON.stringify()除了要序列化的 JavaScript 对象外,还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化 JavaScript 对象。第一个参数是个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在 JSON 字符串中保留缩进。

    如果过滤器参数是数组,那么 JSON.stringify()的结果中将只包含数组中列出的属性。例如:

    1 var book = {
    2 "title": "Professional JavaScript",
    3 "authors": [
    4 "Nicholas C. Zakas"
    5 ],
    6 edition: 3,
    7 year: 2011
    8 };
    9 var jsonText = JSON.stringify(book, ["title", "edition"]);//{"title":"Professional JavaScript","edition":3}

    如果第二个参数是函数,行为会稍有不同。传入的函数接收两个参数,属性(键)名和属性值。根据属性(键)名可以知道应该如何处理要序列化的对象中的属性。属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串。例如:

     1 var book = {
     2 "title": "Professional JavaScript",
     3 "authors": [
     4 "Nicholas C. Zakas"
     5 ],
     6 edition: 3,
     7 year: 2011
     8 };
     9 var jsonText = JSON.stringify(book, function(key, value){
    10 switch(key){
    11 case "authors":
    12 return value.join(",")
    13 case "year":
    14 return 5000;
    15 case "edition":
    16 return undefined;
    17 default:
    18 return value;
    19 }
    20 });

    JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个级别缩进的空格数。例如:

     1 //每个级别缩进 4 个空格
     2 var book = {
     3 "title": "Professional JavaScript",
     4 "authors": [
     5 "Nicholas C. Zakas"
     6 ],
     7 edition: 3,
     8 year: 2011
     9 };
    10 var jsonText = JSON.stringify(book, null, 4);

    保存在 jsonText 中的字符串如下所示:

    1 {
    2 "title": "Professional JavaScript",
    3 "authors": [
    4 "Nicholas C. Zakas"
    5 ],
    6 "edition": 3,
    7 "year": 2011
    8 }//
    9 传入有效的控制缩进的参数值,结果字符串就会包含换行符。(只缩进而不换行意义不大。)最大缩进空格数为 10,所有大于 10 的值都会自动转换为 10。

    toJSON()方法:

    自定义序列化的需求。

    假设把一个对象传入 JSON.stringify(),序列化该对象的顺序如下:

    • 如果存在 toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
    • 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
    • 对第(2)步返回的每个值进行相应的序列化。
    • 如果提供了第三个参数,执行相应的格式化。

    解析:

    将 JSON 字符串直接传递给 JSON.parse()就可以得到相应的 JavaScript 值。例如,使用下列代码就可以创建与 book 类似的对象: var bookCopy = JSON.parse(jsonText); 

    JSON.parse()方法也可以接收另一个参数,该参数是一个函数,接收两个参数,一个键和一个值,而且都需要返回一个值。

  • 相关阅读:
    mysql 15道语句练习题
    分组查询以及where和having的区别
    java初学复习
    Working with Excel Files in Python
    PIP常用命令
    pip install 提示代理连接失败原因及解决办法
    关于Encode in UTF-8 without BOM
    360极速浏览器Onetab插件存储位置
    使用夜神模拟器录制脚本
    微信小程序开发经验总结
  • 原文地址:https://www.cnblogs.com/yangxiaoguai132/p/5190478.html
Copyright © 2011-2022 走看看