详解JSON数据

关于JSON,是一种数据格式,不是一种编程语言;
JSON并不从属于JavaScript,并不是只有javaScript才能使用JSON,JSON只是一种数据格式;

1.语法

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

  • 简单值:可以在JSON中表示字符串、数组、布尔值、和null;但不支持undefined;
  • 对象:对象作为一种复杂数据类型,表示的是一种无序的键值对;每个键值对中的值可以是简单值,也可以是复杂数据类型;
  • 数组:表示一组有序的值的列表,可以通过数值索引来访问其中的值;数组中的值可以是简单值,也可以是复杂数据类型;
1.1 简单值

表示数值:5
表示字符串:Hello world!
在实际应用中,JSON更多地用来表示更复杂的数据结构,而简单值只是整个数据结构中的一部分;

1.2 对象

与JavaScript相比,JSON对象的区别:

  1. JSON对象没有声明变量,JSON中没有声明变量的概念;
  2. 没有末尾的分号,因为这不是JavaScript的语句,所以不需要分号;
  3. JSON对象的属性必须假双引号,这在JSON中是必须的;

JavaScript中的对象例子:

  var object={
    name:"Tom", //JS中的对象属性名,可以添加双引号,也可以不添加
    age:29
  };

JSON对象:(JSON中的对象属性名,必须添加双引号)

{
  "name": "Tom", 
  "age": 29
}
1.3 数组

JSON数组采用的就是JS中的数组字面量的形式。

JS中的数组: JSON数组也没有变量和分号;

var values=[25, "hi", true];

JSON数组:

{25, "hi", true}

把数组和对象结合起来,可以构成更复杂的数据集合;

2.解析JSON

JSON数据的流行原因,一个是因为与JavaScript类似的语法;再一个原因是,JSON数据结构可以解析成有用的JavaScript对象;而XML数据要解析成DOM并且从中提取数据,极为麻烦;

2.1解析JSON对象

不推荐造势的eval()函数,因为可能会执行一些恶意代码;

JSON对象有两个方法:stringify()和parse(), 分别把JS对象序列化为JSON字符串和把JSON字符串解析为原生JS值;

var book={
  title:"js高级教程",
  author:[ "Nicholas C. Zakas"],
  edition:3,
  year:2011 
}
var jsonText=JSON.stringify(book);
console.log(jsonText);

转换结果:

{"title":"js高级教程","author":["Nicholas C. Zakas"],"edition":3,"year":2011}

**注意:**所有的函数及原型成员都会被有意忽略,不体现在结果中;值为undefined的任何属性,也都会被跳过。最终都是值为有效JSON数据类型的实例属性;

使用parse转成JS值:

var book={
title:"js高级教程",
author:[ "Nicholas C. Zakas"],
edition:3,
year:2011
}
var jsonText=JSON.stringify(book);
console.log(jsonText);
var bookCopy=JSON.parse(jsonText);
console.log(bookCopy);

//控制台结果
Object
author: ["Nicholas C. Zakas"]
edition: 3
title: "js高级教程"
year: 2011
__proto__: Object

虽然book和bookCopy具有相同的属性,但他们是两个没有任何关系的对象;

如果传入给JSON.parse()的字符串不是有效的JSON,则会抛出错误;

2.2序列化选项

JSON.stringify()可以接受另外两个参数,第一个参数是过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进;

2.2.1 过滤结果

如果过滤器 参数是数组,那么JSON.stringify()的结果只包含数组中列举的属性;

  var book = {
    title: "js高级教程",
    author: ["Nicholas C. Zakas"],
    edition: 3,
    year: 2011
  }
  var jsonText = JSON.stringify(book,["title","edition"]);
  console.log(jsonText);
   //  {"title":"js高级教程","edition":3}

如果过滤器的参数是函数,,则传入的函数接受两个参数,属性名和属性值;
函数的返回值就是相应的值; 如果函数返回了undefined,那么对应的属性就会被忽略;

  var book = {
    title: "js高级教程",
    author: ["Nicholas C. Zakas"],
    edition: 3,
    year: 2011
  }
  var jsonText = JSON.stringify(book,function(key,value){
    switch(key){
      case"authors": 
        return value.join(",");
      case"year": 
        return 5000;
      case"edition": 
        return undefined;
      default: 
        return value;
    }
  });
  console.log(jsonText);

  //  {"title":"js高级教程","author":["Nicholas C. Zakas"],"year":5000}
2.2.2 字符串缩进

JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果传入一个数值,那么他表示的是每个级别缩进的空格数;只要传入有效的控制缩进的参数值,结果中的字符串就会包含换行符。

  var book = {
    title: "js高级教程",
    author: ["Nicholas C. Zakas"],
    edition: 3,
    year: 2011
  }
  var jsonText = JSON.stringify(book,null, 4);
  console.log(jsonText);

输出结果:

{
    "title": "js高级教程",
    "author": [
        "Nicholas C. Zakas"
    ],
    "edition": 3,
    "year": 2011
}

缩进字符串最长不超过10个字符长,超过则默认只显示10个字符串;

2.3 解析选项

JSON.parse()方法可以接受另外外一个参数,该参数为一个函数;为了区别JSON.stringify()接收的过滤函数,JSON.parse的函数参数称为还原函数;

实际上两个函数是相同的,都接收键和值两个参数,返回一个值;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值