高级程序设计——JSON

一、前言

  1. JSON是JavaScript的一个严格的子集,利用了JavaScript中的一些模式来表示结构化数据
  2. JSON是一种数据格式,不是一种编程语言
  3. 虽然具有相同的语法形式,但JSON并不从属于JavaScript

二、语法

  1. JSON的语法可以表示三种类型
  2. 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。但JSON不支持JavaScript中的特殊值undefined
  3. 对象:对象作为一种复杂数据类型,表示的是一组无序的键值对。每个键值对中的值可以是简单值、复杂数据类型的值
  4. 数组:复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型:简单值、对象、数组
  5. JSON不支持变量、函数或对象实例

1.简单值

  1. JSON字符串必须使用双引号
  2. 布尔值和null也是有效的JSON形式

2.对象

  1. 没有变量声明
  2. 没有末尾的分号
  3. 对象的属性必须加双引号
  4. 同一个对象中绝对不应该出现两个同名属性
{
    "name":"Nicholas",
    "age":29,
    "school":{
        "name":"mary",
        "location":"north"
    }
}

3.数组

  1. 同样没有变量和分号
  2. 对象和数组通常是JSON数据结构的最外层形式(当然,这不是强制规定的),利用他们能创造出各种各样的数据结构
{
    "title":"hello",
    "authors":["jack",29],
    "edition":3,
    "year":2011
}

三、解析与序列化

  1. 可以把JSON数据结构解析为有用的JavaScript对象
    2.使用方便

1.JSON对象

  1. 全局对象JSON。这个对象有2个方法
  2. stringify()
    • 用于把JavaScript对象序列化为JSON字符串
    • 默认情况下返回的字符串不包含任何空格字符或缩进
    • 在序列化JavaScript对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。此外,值为undefined的任何属性也会被跳过,结果中最终都是有效JSON数据类型的实例属性
  3. parse()
    • 把JSON字符串解析为原生JavaScript值
  4. 通过parse()返回的JavaScript与传入stringify()的JavaScript虽然具有相同的属性,但没有什么关系
var book={
    title:"hello",
    authors:["jack",29],
    edition:3,
    year:2011
};
var jsontext=JSON.stringify(book);
var bookcopy=JSON.parse(jsontext);

2.序列化选项

  1. JSON.stringify()还可以接受两外两个参数
  2. 第一个参数是个过滤器:数组/函数
    • 数组,则方法返回的结果中只包含数组中列出的属性
      JSON.stringify(book,["title"]),则返回的字符串中只包含title这个属性{"title":"hello"}
    • 函数,接收两个参数:属性名和属性值
      • 属性名只能是字符串,而在值并非键值对结构的值时,键名可以是空字符串
      • 如果函数返回了undefined,那么相应的属性会被删除
  3. 第二个参数是一个选项,用于控制结果中的缩进和空白符

    • 如果这个参数是一个数值,那它表示的是每个级别缩进的空格数
    • 如果这个参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符(不再使用空格)
    • 只要传入有效的控制缩进的参数值,结果字符串就会包含换行符
    • 缩进的数值不能超过10,如果大于10就会自动转换为10
    • 缩进的字符串最长不能超过10个字符串,如果超过,结果中将只出现前10个字符
    var jsontext=JSON.stringify(book,null,4);
    var jsontext1=JSON.stringify(book,null,"--");
  4. 可以给对象定义toJSON()方法,返回其自身的JSON数据格式

    • 原生Date对象有一个toJSON()方法,能够将JavaScript的Date对象自动转换成ISO 8601日期字符串(与在Date对象上调用toISOSstring()的结果完全一样)
    • 可以为任何对象添加toJSON()方法
    • 可以让toJSON()方法返回任何值,他都能正常工作。如果返回undefined,此时如果包含它的对象嵌入在另一个对象中,会导致它的值变成null,二如果它是顶级对象,结果就是undefined。
    var book={
        title:"hello",
        authors:["jack",29],
        edition:3,
        year:2011,
        toJSON:function(){
            return this.title;
        }
    };
    var jsontext=JSON.stringify(book);//"hello"
  5. 序列化对象的顺序:
    (1). 如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身
    (2). 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值
    (3). 对第(2)步返回的每个值进行相应的序列化
    (4). 如果提供了第三个参数,执行相应的格式化

3.解析选项

  1. JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用。称为还原函数
  2. 与过滤函数相似,传入属性名和属性值,返回一个值
  3. 如果还原函数返回undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。

    var book={
        title:"hello",
        authors:["jack",29],
        edition:3,
        year:2011,
        releaseDate:new Date(2011,11,1);
    };
    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());//2011
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值