说明



XML,类似于HTML标签语言,只是标签是自定义标签


比如小程序的配置,基本都是JSON格式
语法
基本
轻量级的数据交换格式,UTF-8,字符串规定必须用双引号” “,Object的键也必须用双引号” “,数值、布尔值、null不用加。
.json 文件最顶层,支持3种形式的数据:
简单值
对象值
数组值
注释
================
JSON序列化

JSON 对象

================
转换成JSON(stringify)
1、基本使用
{name: '小明',age: 14,gender: true,height: 1.65,grade: null,'middle-school': '\"W3C\" Middle School',skills: ['JavaScript', 'Java', 'Python', 'Lisp']};//对象转换成json字符串var s = JSON.stringify(xiaoming);/*{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}*/
2、第二个参数(过滤、批处理)
第二个参数用于控制如何筛选对象的键值
// 如果我们只想输出指定的属性,可以传入Array数组;JSON.stringify(xiaoming, ['name', 'skills'], );/*{"name": "小明","skills": ["JavaScript","Java","Python","Lisp"]}*/// 或者传入函数,对键和值进行处理JSON.stringify(xiaoming, (key,value)=>{if(key === "age"){return value + 1}return value// 一定要返回value相关// 返回 undefined 会导致属性被忽略。});/*{"name":"小明","age":15,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}*/
3、第三个参数 (缩进)
第三个参数控制显示的缩进,对每个属性进行换行,然后前面加上 x 个空格。
最大缩进值 x 为 10,大于 10 的值会自动设置为 10。
// 要输出得好看一些,可以加上参数,按缩进输出:JSON.stringify(xiaoming, null, 2);/*{"name": "小明","age": 14,"gender": true,"height": 1.65,"grade": null,"middle-school": "\"W3C\" Middle School","skills": ["JavaScript","Java","Python","Lisp"]}*/
如果你输入的是字符串,前面的缩进空格就会变成你输入的字符串

4、自定义转化规则
如果我们还想要精确控制如何序列化小明,可以给xiaoming定义一个toJSON()的方法,直接返回JSON应该序列化的数据:
var xiaoming = {name: '小明',age: 14,gender: true,height: 1.65,grade: null,'middle-school': '\"W3C\" Middle School',skills: ['JavaScript', 'Java', 'Python', 'Lisp'],toJSON: function () {return { // 只输出name和age,并且改变了key:'Name': this.name,'Age': this.age};}};JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'
注意,箭头函数不能用来定义 toJSON()方法。主要原因是箭头函数的词法作用域是全局作用域,在这种情况下不合适。
toJSON()方法可以与过滤函数一起使用,因此理解不同序列化流程的顺序非常重要。
在把对象传给 JSON.stringify()时会执行如下步骤:
(1) 如果可以获取实际的值,则调用 toJSON()方法获取实际的值,否则使用默认的序列化。
(2) 如果提供了第二个参数,则应用过滤。传入过滤函数的值就是第(1)步返回的值。
(3) 第(2)步返回的每个值都会相应地进行序列化。
(4) 如果提供了第三个参数,则相应地进行缩进。
理解这个顺序有助于决定是创建 toJSON()方法,还是使用过滤函数,抑或是两者都用。
函数转换JSON
应该避免在 JSON 中使用函数,函数会失去其作用域,而且您还需要使用 eval( ) 将它们转换回函数。
<script>var obj = { name: "Bill Gates", age: function () {return 62;}, city: "Seattle" };obj.age = obj.age.toString();var myJSON = JSON.stringify(obj);document.getElementById("demo").innerHTML = myJSON;</script>
=================
JSON转换成对象
1、基本使用
JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}JSON.parse('true'); // trueJSON.parse('123.45'); // 123.45
2、第二个参数 (批处理)
var obj = JSON.parse('{"name":"小明","age":14}', function (key, value) {if (key === 'name') {return value + '同学';}return value;});// {name: '小明同学', age: 14}
特别
1、JSON 中不允许日期对象
如果您需要包含日期,请写为字符串。
之后您可以将其转换回日期对象:
<script>var text = '{"name":"Bill Gates", "birth":"1955-10-28", "city":"Seattle"}';var obj = JSON.parse(text);obj.birth = new Date(obj.birth);document.getElementById("demo").innerHTML = obj.name + ", " + obj.birth;</script>//或者用JSON.parse()的第二个参数,是一个处理函数<script>var text = '{"name":"Bill Gates", "birth":"1955-10-28", "city":"Seattle"}';var obj = JSON.parse(text, function (key, value) {if (key == "birth") {return new Date(value);} else {return value;}});document.getElementById("demo").innerHTML = obj.name + ", " + obj.birth;</script>
2、JSON 中不允许函数
如果您需要包含函数,请把它写作字符串。
稍后您可以把它转换回函数:
<script>var text = '{"name":"Bill Gates", "age":"function() {return 62;}", "city":"Seattle"}';var obj = JSON.parse(text);obj.age = eval("(" + obj.age + ")");//eval()是把括号内的字符串当做js语句来使用。如果要直接运行函数,需要加()括号document.getElementById("demo").innerHTML = obj.name + ", " + obj.age();</script>
3、undefined
如果是 undefined,则结果中就会删除相应的键。
================
其他应用
1、简单的深拷贝

直接把一个值转成JSON,然后再转回来,可以实现简单的深拷贝。
但是有问题:
1、函数不行,函数默认转化成JSON是被移除的。
2、undefined也不行,也是被移除
3、Symbol也不行,也是被移除
