理解JSON

JSON是JavaScript的一个严格的子集,利用了JavaScript中的一些模式来表示结构化数据。
最重要的是理解它是一种数据格式,不是编程语言。虽然语法形式相同,但并不从属于JS,且JSON可以应用于多个编程语言中。

一、语法

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

(1)简单值

使用与JS相同的语法,可在JSON中表示字符串、数值、布尔值、null.不支持undefined。
例:
5 表示数值5
“Hello world!” 表示字符串。与JS字符串的区别是必须使用双引号(单引号导致语法错误)。

(2)对象

复杂数据类型。每个键值对的值可以是简单值或复杂数据类型的值。
JS中的对象字面量:
var person = {
name:“Jim”,
age:29
};
JSON表示上述对象的方式:
{
“name”:“Jim”,
“age”:“29”
}
区别:
JSON没有声明变量(没有变量的概念);
没有末尾分号。因为不是JS语句。
对象的属性必须加双引号

(3)数组

复杂数据类型。数组值也可以是任意类型。
JSON数组采用JS中的数组字面量形式。例如:
JS中的数组字面量:
var values = [ 25,“hi”,true];
JSON中的数组:
[25,“hi”,true]
同样的,JSON数组也没有分号。
JSON不支持变量、函数或对象实例。

二、解析与序列化

可以把JSON数据结构解析为有用的JS对象,是Web服务开发中交换数据的事实标准。

1、JSON对象

早期的JSON解析器基本是使用JS的eval()函数。ECMAScript 5对解析JSON的行为进行规范,定义了全局对象JSON。该对象有2个方法:stringify()和parse(),分别用于把JS对象序列化为JSON字符串和把JSON字符串解析为原生JS值。例如:
var book = {
title:“Read”,
year:2001
};
var jsonText = JSON.stringify(book); 把book对象序列化为JSON字符串,并保存在变量jsonText中。
序列化JS对象时,会忽略函数、原型成员、undefined值的属性。最终结构都是值为有效JSON数据类型的实例属性。

将JSON字符串直接传递给JSON.parse()获得相应的JS值:var bookCopy = JSON.parse(jsonText);

2、序列化选项

JSON.stringify()还可接收另外2个参数,用于指定以不同方式序列化JS对象。
第一个参数是个过滤器,可以是数组、函数;
第二个参数是选项,表示是否在JSON字符串保留缩进。
单独或组合使用这两个参数,可更全面控制JSON序列化。
(1)过滤结果
若过滤器参数是数组,name序列化的结果只包含数组中的属性:
var book = {
title:“Read”,
year:2001,
edition:3,
author:“Jim”
};
var jsonText = JSON.stringify(book,[“title”,“edition”]);
返回的字符串:{“title”:“Read”,“edition”:“3”}

若第二个参数是函数,例如:
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;
}
});
该函数接收两个参数。属性名和属性值。函数中设定遇到某个属性名时,如何返回对应的值。若返回undefined,则该属性被忽略。
最后,一定要提供 default 项,此时返回传入的值,以便其他值都能正常出现在结果中。(除了以上需要过滤的属性,其他属性正常显示。)

(2)字符串缩进
例如,要在每个级别缩进 4 个空格:
var jsonText = JSON.stringify(book, null, 4);
保存在 jsonText 中的字符串如下所示:
{
“title”: “Read”,
“authors”: “Jim”,
“edition”: 3,
“year”: 2001
}
每行属性前显示4个空格,且包含换行符。最大缩进空格数为10。
若缩进参数是字符串,则在JSON字符串被用作缩进字符代替空格。
如:var jsonText = JSON.stringify(book, null, “–”);
保存在 jsonText 中的字符串如下所示:
{
–“title”: “Read”,
–“authors”: “Jim”,
–“edition”: 3,
–“year”: 2001
}

(3)toJSON()方法
又是JSON.stringify()方法不能满足某些自定义序列化的需求,可以给对象定义toJSON()方法,返回其自身的JSON数据格式。
理解序列化的内部顺序:
(1) 如果存在 toJSON() 方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
(2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
(3) 对第(2)步返回的每个值进行相应的序列化。
(4) 如果提供了第三个参数,执行相应的格式化。

3、解析选项

JSON.parse()方法也可接收另一个参数,区别于JSON.stringify()接收的过滤函数,该函数称为还原函数。

猜你喜欢

转载自blog.csdn.net/weixin_43888129/article/details/87893267