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

Javascript学习之:JSON的更多相关文章

  1. javascript学习之JSON

    JSON本来是javascript的一个自己,后来已经成为了一种独立的数据格式,在web应用中运用极其广泛. 与javascript对象不同的是,JSON中的属性名任何时候都必须加双引号. javaS ...

  2. JavaScript学习笔记-JSON对象

    JSON 是一种用来序列化对象.数组.数值.字符串.布尔值和 null 的语法.它基于 JavaScript 语法,但是又有区别:一些 JavaScript 值不是 JSON,而某些 JSON 不是 ...

  3. 10. JavaScript学习笔记——JSON

    10. JSON ///[JSON是一种数据格式,不是JS 独有的] ///[JSON语法] /* 1.数据书写格式:"name":value,JSON要求给属性名加上[双引号], ...

  4. javascript学习-创建json对象数据,遍历

    之前我已经有讲过后台返回json数据到前台,并在前台遍历json数据. 这里讲下直接在JS里创建JSON数据,然后遍历使用~ 创建代码例如以下:(创建的是JSON对象) var YearSelect ...

  5. Json学习总结(1)——Java和JavaScript中使用Json方法大全

    摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语 ...

  6. HTMl5/CSS3/Javascript 学习推荐资源

    HTMl5/CSS3/Javascript 学习推荐资源 前端的定义应该是数据内容的展示,在国内大家都觉得前端只是HTML+CSS+Javascript,但是实际上与展示有关的都是前端,所以Ruby/ ...

  7. JavaScript学习总结-技巧、有用函数、简洁方法、编程细节

    整理JavaScript方面的一些技巧.比較有用的函数,常见功能实现方法,仅作參考 变量转换 //edit http://www.lai18.com var myVar = "3.14159 ...

  8. 第18天 ajax技术和javascript加强(json)

    第18天    ajax技术和javascript加强(json) 复习: B/S架构实现文件上传的思路? 使用a标签实现文件下载功能,有什么问题? 使用Servlet实现文件下载的思路? 今日任务 ...

  9. javascript学习-类型判断

    javascript学习-类型判断 1.类型判断的的武器 javascript中用于类型判断的武器基本上有以下几种: 严格相等===,用来判断null,undefined,true,false这种有限 ...

随机推荐

  1. Laravel常见问题集锦

    1.提示:Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes? ...

  2. xmanagr 注册机执行ubuntu 桌面程序,ubuntu无需安装 桌面环境

    Xshell 5 注册码: 690313-111999-999313Xftp 5 注册码:101210-450789-147200 Xmanager 5 注册码:101210-450789-14720 ...

  3. 关于spfa

    关于spfa的一些事宜.... 刚开始学的时候只会跑最短路,代码都是背下来的.以下是背的代码... inline void spfa(int s) { queue<int>q;q.push ...

  4. HTTPS数据传输过程简介

    HTTPS数据传输过程 1.客户端发起HTTPS连接握手 2.服务端收到HTTPS握手连接请求,与客户建立握手过程,和TCP的三次握手类似,并发送一系列的加密算法组合给客户端,与客户端协商加密算法组合 ...

  5. create react app遇到的问题

    我现在想的是吧 static 资源和动态 api 来分开处理, static 资源开启 nginx 服务器,api 请求由 express 完成, 现在的问题是开发的时候 proxy 设定将所有的请求 ...

  6. python--第十二天总结(Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy)

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  7. php的AES加密、解密类

    <?php /** * php.ios.Android 通用的AES加密.解密方法 */ namespace Common\Business; class AESCrypt { /** * 初始 ...

  8. Python自动化测试用例设计--测试类型

    1.前言 WEB自动化测试时候测试哪些类型,下面将介绍一下: 2. 测试类型 2.1 测试静态内容 静态内容测试是最简单的测试,用于验证静态的.不变化的UI 元素的存在性.例如: 每个页面都有其预期的 ...

  9. FortiGate防火墙500D下PC至外网丢包

    1.现状: 如图,防火墙堆叠,500D共4个出口方向,联通.电信.FQ.运维专线 2.现象: 到网关和防火墙上.下联口不丢包,到网联通和运维专线方向丢包4%左右,电信和FQ方向不丢包 3.分析 采用从 ...

  10. [leetcode]20. Valid Parentheses有效括号序列

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...