zoukankan      html  css  js  c++  java
  • JS高程3:JSON

    JSON,JavaScript Object Notation,JS对象表示法,是目前最常见的传输结构化数据的数据结构。

    JSON并非编程语言,而是一种数据结构,像mp4、avi一样,只是一种数据格式而已。(数据结构可以包含很多数据类型)

    JSON值的类型

    • 简单值
    • 对象
    • 数组

    简单值:字符串、数字、布尔值和null,注意不包括undefined。

    注意:JSON中的字符串必须用双引号。

    对象:对象就是无序的键值对,而键值中的值也可以是简单值、对象或者数组。

    注意:JSON中对象的属性必须用双引号括起来,JSON中没有变量的概念。

    数组:有序的值的列表,而值本身可以是简单值、对象或者数组。

    解析与序列化

    JS中有个全局对象JSON,该对象有stringify()和parse()方法,分别用来序列化JS和解析JSON。

    var obj = {
    	name: "leo",
    	age: 19,
    	marry: false,
    	other: undefined,
    	none: null,
    };
    var j1 = JSON.stringify(obj);
    console.log(j1);
    var j2 = JSON.parse(j1);
    console.log(j2)
    

     注意:因为JSON中没有undefined数据类型,所以该键值会被忽略。

    {"name":"leo","age":19,"marry":false,"none":null}
    {name: "leo", age: 19, marry: false, none: null}
    

    序列化选项

    JSON.stringify()函数还可以接收第二个和第三个参数,用来实现更为丰富的功能。

    过滤

    第二个参数可以是一个数组,数组包含对象属性的字符串形式:

    var obj = {
    	name: "leo",
    	age: 19,
    	marry: false,
    	other: undefined,
    	none: null,
    };
    var j1 = JSON.stringify(obj,["name","age",]);
    console.log(j1); //{"name":"leo","age":19}
    

     如果参数是函数:

    var obj = {
    	name: "leo",
    	age: 19,
    	marry: false,
    	other: undefined,
    	none: null,
    };
    var j1 = JSON.stringify(obj,function(key,value){
    		switch(key){
    			case "age":
    				return 20;
    			case "none":
    				return "没有";
    			case "marry":
    				return "false";
    			default:
    				return value;
    		}
    });
    console.log(j1); //{"name":"leo","age":20,"marry":"false","none":"没有"}
    

    缩进

    如果想缩进4空格:

    var obj = {
    	name: "leo",
    	age: 19,
    	marry: false,
    	other: undefined,
    	none: null,
    };
    var j1 = JSON.stringify(obj,null,4);
    console.log(j1);
    
    {
        "name": "leo",
        "age": 19,
        "marry": false,
        "none": null
    }

    注意:最大缩进为10格。

    特殊字符:

    var obj = {
    	name: "leo",
    	age: 19,
    	marry: false,
    	other: undefined,
    	none: null,
    };
    var j1 = JSON.stringify(obj,null,"-->");
    console.log(j1);
    
    {
    -->"name": "leo",
    -->"age": 19,
    -->"marry": false,
    -->"none": null
    }

    使用toJSON:

    var obj = {
    	name: "leo",
    	age: 19,
    	marry: false,
    	other: undefined,
    	none: null,
    	toJSON: function(){
    		return this.name;
    	}
    };
    var j1 = JSON.stringify(obj);
    console.log(j1); //"leo"
    

    序列化该对象的顺序如下

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

    解析选项

    JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用

    var obj = {
    	name: "leo",
    	age: 19,
    	marry: false,
    	other: undefined,
    	none: null,
    	releaseDate: new Date(2011, 11, 1),
    };
    var j1 = JSON.stringify(obj);
    console.log(j1);
    var j2 = JSON.parse(j1,function(key,value){
    	if (key == "releaseDate"){
    		return new Date(value);
    	} else {
    		return value;
    }
    });
    console.log(j2);
    console.log(j2.releaseDate.getFullYear());
    
    {"name":"leo","age":19,"marry":false,"none":null,"releaseDate":"2011-11-30T16:00:00.000Z"}
    {name: "leo", age: 19, marry: false, none: null, releaseDate: Thu Dec 01 2011 00:00:00 GMT+0800 (中国标准时间)}age: 19marry: falsename: "leo"none: nullreleaseDate: Thu Dec 01 2011 00:00:00 GMT+0800 (中国标准时间) {}__proto__: Object
    2011

    还原函数在遇到"releaseDate"键时,会基于相应的值创建一个新的 Date 对象。结果就是
    bookCopy.releaseDate 属性中会保存一个 Date 对象。正因为如此,才能基于这个对象调用
    getFullYear()方法。

  • 相关阅读:
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint......
    模拟Executor策略的实现
    设计3D标签
    创建被图像填充的组件
    netty基础09_利用EmbeddedChannel做单元测试
    netty基础08_引导类
    netty基础07_Netty提供的消息处理器和编码解码器
    netty基础06_编码器和解码器
    netty基础05_管道和消息处理器
    netty基础04_数据缓冲区
  • 原文地址:https://www.cnblogs.com/leomei91/p/7560672.html
Copyright © 2011-2022 走看看