JSON学习笔记

描述

谈到JSON,就能想到 交互 和 前后端数据交换。

JSON(JavaScript Object Notation, JS对象标记),是一种轻量级的数据交换格式。

它基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON格式的数据,主要是为了跨平台交流数据用的。JSON独立于语言和平台,JSON解析器和JSON 库支持许多不同的编程语言。

XML (EXtensible Markup Language, 扩展标记语言)

JSON出现之前,XML一直是互联网传输结构化数据的事实标准,使用DTD(document type definition)文档类型定义来组织数据,一度成为业界公认的标准,特点是:

1.格式统一

2.跨平台和语言

3.描述复杂结构能力较强

4.xml使用标签对描述数据内容

JSON(JavaScript Object Notation, JS对象标记)

在2002年的一天,道格拉斯·克罗克福特(Douglas Crockford)发明了JSON这种超轻量级的数据交换格式。

道格拉斯同学长期担任雅虎的高级架构师,自然钟情于JavaScript。他设计的JSON实际上是JavaScript的一个子集。

由于JSON非常简单,很快就风靡Web世界,并且成为ECMA标准。几乎所有编程语言都有解析JSON的库,而在JavaScript中,我们可以直接使用JSON,因为JavaScript内置了JSON的解析。

把任何JavaScript对象变成JSON,就是把这个对象序列化成一个JSON格式的字符串,这样才能够通过网络传递给其他计算机。

如果我们收到一个JSON格式的字符串,只需要把它反序列化成一个JavaScript对象,就可以在JavaScript中直接使用这个对象了。

JSON是一种轻量级的数据交换格式,特点是:

1.简单易读

2.轻量级

3.传输速度比XML快

4.支持多种语言

5.能够使用内建的 JavaScript eval() 方法进行解析

6.JSON是使用键值对的形式来描述数据

数据类型

number:和JavaScript的number完全一致;

boolean:就是JavaScript的true或false;

string:就是JavaScript的string;

null:就是JavaScript的null;

array:就是JavaScript的Array表示方式 [];

object:就是JavaScript的object表示方式 { … }。

以及上面的任意组合。

为了统一解析,JSON的字符串规定必须用双引号”“,Object的键也必须用双引号”“。

stringify方法 序列化

先把一个对象序列化成JSON格式的字符串:

var neo = {
	name: '倪云港',
	age: 19,
	school: 'HLJU',
	skills: ['JavaScript', 'C++', 'Git', 'Vue']
};
JSON.stringify(neo); 

输出结果:

"{"name":"倪云港","age":19,"school":"HLJU","skills":["JavaScript","C++","Git","Vue"]}"

要输出得好看一些,可以加上第三个参数,按缩进输出:

JSON.stringify(neo, null, '    ');

输出结果:

"{
    "name": "倪云港",
    "age": 19,
    "school": "HLJU",
    "skills": [
        "JavaScript",
        "C++",
        "Git",
        "Vue"
    ]
}"

stringify方法第二个参数用来控制筛选对象的键值,如果我们只想输出指定的属性,可以传入Array:

JSON.stringify(neo, ['name', 'skills'], '    ');

输出结果:

"{
    "name": "倪云港",
    "skills": [
        "JavaScript",
        "C++",
        "Git",
        "Vue"
    ]
}"

stringify方法第二个参数还可以传入一个函数,这样对象的每个键值对都会被函数先处理:

function convert(key, value) {
    if (typeof value === 'string') {
        return value.toUpperCase();
    }
    return value;
}
//上面的代码把所有属性值都变成大写:
JSON.stringify(neo, convert, '    ');

输出结果:

"{
    "name": "倪云港",
    "age": 19,
    "school": "HLJU",
    "skills": [
        "JAVASCRIPT",
        "C++",
        "GIT",
        "VUE"
    ]
}"

如果还想要精确控制如何序列化neo,可以给neo定义一个toJSON()的方法,直接返回JSON应该序列化的数据:

var neo = {
	name: '倪云港',
	age: 19,
	school: 'HLJU',
	skills: ['JavaScript', 'C++', 'Git', 'Vue'],
    toJSON: function () {
        return {  // 只输出name和age,并且改变了key:
            'Name': this.name,
            'Age': this.age
        };
    }
};

JSON.stringify(neo);

输出结果:

"{"Name":"倪云港","Age":19}"

JSON.parse()方法 反序列化

拿到一个JSON格式的字符串,我们直接用JSON.parse()把它变成一个JavaScript对象:

JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]
JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
JSON.parse('true'); // true
JSON.parse('123.45'); // 123.45
var datatext = '{"name" : "倪云港","skills" : ["JavaScript", "C++", "Git", "Vue"] }';
var data = JSON.parse( datatext );
console.log(data);

输出结果:

Object {name: "倪云港", skills: Array(4)}
	name:"倪云港"
	skills:Array(4)
		0:"JavaScript"
		1:"C++"
		2:"Git"
		3:"Vue"
		length:4
	__proto__:Array(0)
__proto__:Object
- CATALOG -