zoukankan      html  css  js  c++  java
  • Javascript学习之:JSON

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于ECMAScript的一个子集,采用完全独立于语言的文本格式。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

    1、语法

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

    • 简单值:使用与Javascript相同的语法,可以在JSON中表示字符串、数值、布尔值和null,但是不支持Javascript中的特殊值undefined。
    • 对象:对象作为一种复杂数据结构,表示的是一种无序的键值对。每个键值对中的值可以是简单值,也可以是复杂数据类型的值。
    • 数组:数组作为一种复杂数据结构,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值可以是任何类型——简单值、对象或数组。

    下面详细介绍下这三种类型:

    1)、简单值:

      数值表示:5

      字符串表示:"Hello World!"

      JSON字符串与Javascript字符串最大的不同是,JSON字符串必须使用双引号(单引号会引发语法错误)。

    2)、对象:

      举一个Javascript对象来对比说明,下面是一个Javascript中的对象字面量:

    var man = {
          name: "McBye",
          age: 24
    };

      而在JSON中,这个对象字面量就必须写成:

    {
          "name": "McBye",
          "age": 24
    }

    可以看出三个区别:

    • 没有声明变量,这是因为JSON中没有变量的概念;
    • 没有末尾的分号,因为这不是Javascript语句,不需要分号;
    • 对象的属性必须加双引号。

    3)、数组:

      JSON数组采用的是Javascript中的数组字面量形式。举例如下:

      Javascript数组字面量:var man = ["McBye", 24, "pku", true];

      JSON中表示的同一个数组:["McBye", 24, "pku", true]

      可以看到,JSON数组也没有变量和分号。

      将数组和对象结合起来,可以构成更复杂的数据集合,例如上面的JSON数组可以扩充为以下:

    [
        [
            "name": "McBye",
            "age": 24,
          "college": [
                "pku",
            "eecs"
            ]
        ],
      [
            "name": "King",
            "age": 20,
        ]
    ]                                    

    2、解析与序列化:

      JSON流行的重要原因之一是,JSON数据结构可以和Javascript对象进行双向的解析。

      早期的JSON解析器基本上就是使用Javascript的eval()函数。由于使用eval()对JSON数据结构进行求值存在风险,因为可能会执行一些恶意代码。

    1)、JSON对象有两个方法:

      stringify()——用于把Javascript对象序列化为JSON字符串。

    var man = {
          name: "McBye",
          age: 24,
        skills: undefine,
        func: function(){//nothing happens...}
    };

      对上面的Javascript对象序列化:var jsonMan = JSON.stringify(man);

      默认情况下,JSON.stringify()输出的JSON字符串不包括任何空格或缩进,因此保存在manCopy中的字符串为:

    {"name":"McBye","age":24}

      在序列化Javascript对象时,所有的函数和原型成员都会被有意忽略,不体现在结果中,并且值为undefined的任何属性也会被跳过。结果中最终都是值为有效的JSON数据类型的实例属性。

      parse()——用于将JSON字符串解析为Javascript对象。

    var manCopy = JSON.parse(jsonMan);

      man和manCopy两个对象,除了JSON有意忽略的属性和函数之外,其他属性都是相同的,但即使没有这些被忽略的属性与函数,man和manCopy也是完全独立、没有关系的两个对象。

    2)、序列化选项:

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

    a、过滤结果:

      如果过滤器参数是数组,那么stringify()的结果中仅包含数组中列出的属性。还是以上面的那个例子说明:

    var man = {
          name: "McBye",
          age: 24,
        skills: "Javascript",
    };
    var jsonText = JSON.stringify(man, ["name", "skills"]);

      上面的jsonText的值应该是只包含"name"、"skills"两个属性的字符串:

    {"name":"McBye","skills":"Javascript"}

      如果第二个参数是函数,传入的函数接受两个参数,属性名和属性值。根据属性名可以知道怎么序列化对象中属性。为了改变序列化对象的结果,函数返回的值就是相应属性的值。要注意的是,如果函数返回了undefined,那么相应的属性会被忽略。

    var man = {
          name: "McBye",
          age: 24,
        skills: "Javascript",
    };
    var jsonText = JSON.stringify(man, function(key, value){
      switch(key):{
        case "name":
          return "King";
        case "age":
          return "secret";
        default:
          return value;
      }
    });

      经过这个函数过滤器之后,序列化的JSON字符串的结果是:

    {"name":"King","age":"secret","skills":"Javascript"}

    b、字符串缩进:

      JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示每个级别缩进的空格数。并且,只要传入有效的控制缩进的参数值结果字符串就会包含换行符,这是比较人性化的一个设置呢,不过最大缩进格数为10,超过10的话都会自动转换为10。

    c、toJSON()方法:

      给对象定义toJSON方法,可以返回其自身的JSON数据格式。可以为任何对象添加toJSON()方法。例如:

    var man = {
          name: "McBye",
          age: 24,
        skills: "Javascript",
        toJSON: function({return this.name;})
    };
    var jsonText = JSON.stringify(man);

      上述代码执行后jsonText中保存的字符串是"McBye"。

    toJSON()可以作为函数过滤器的补充,因此理解序列化的内部顺序非常重要。序列化一个对象的顺序如下:

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

      参考资料:《Professional Javascript for Web Developers》,Nicholas C.Zakas

  • 相关阅读:
    查询datatime类型
    ms的题目,无聊不妨看看
    读取客户端收藏夹资料的问题
    delphi中的DBGrid无法刷新数据
    jsp与javascript
    .net2.0 web site中的cs文件怎么编译为dll
    由传奇木马引起的遐想
    com组件的调用
    Crystal Report的奇怪问题
    算法导论15章LCS实现(c++)
  • 原文地址:https://www.cnblogs.com/EnderH/p/5341342.html
Copyright © 2011-2022 走看看