说明

image.png
image.png
image.png
image.pngXML,类似于HTML标签语言,只是标签是自定义标签

image.png

image.png
比如小程序的配置,基本都是JSON格式

语法

基本

轻量级的数据交换格式,UTF-8,字符串规定必须用双引号” “,Object的键也必须用双引号” “,数值、布尔值、null不用加。

.json 文件最顶层,支持3种形式的数据:
image.png
image.png简单值
image.png 对象值
image.png 数组值

注释

不支持注释,没有任何注释相关

================

JSON序列化

image.png

JSON 对象

image.png

================

转换成JSON(stringify)

1、基本使用

  1. {
  2. name: '小明',
  3. age: 14,
  4. gender: true,
  5. height: 1.65,
  6. grade: null,
  7. 'middle-school': '\"W3C\" Middle School',
  8. skills: ['JavaScript', 'Java', 'Python', 'Lisp']
  9. };
  10. //对象转换成json字符串
  11. var s = JSON.stringify(xiaoming);
  12. /*
  13. {"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}
  14. */

2、第二个参数(过滤、批处理)

第二个参数用于控制如何筛选对象的键值

  1. // 如果我们只想输出指定的属性,可以传入Array数组;
  2. JSON.stringify(xiaoming, ['name', 'skills'], );
  3. /*
  4. {"name": "小明","skills": ["JavaScript","Java","Python","Lisp"]}
  5. */
  6. // 或者传入函数,对键和值进行处理
  7. JSON.stringify(xiaoming, (key,value)=>{
  8. if(key === "age"){
  9. return value + 1
  10. }
  11. return value
  12. // 一定要返回value相关
  13. // 返回 undefined 会导致属性被忽略。
  14. });
  15. /*
  16. {"name":"小明","age":15,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}
  17. */

3、第三个参数 (缩进)

第三个参数控制显示的缩进,对每个属性进行换行,然后前面加上 x 个空格。

最大缩进值 x 为 10,大于 10 的值会自动设置为 10。

  1. // 要输出得好看一些,可以加上参数,按缩进输出:
  2. JSON.stringify(xiaoming, null, 2);
  3. /*
  4. {
  5. "name": "小明",
  6. "age": 14,
  7. "gender": true,
  8. "height": 1.65,
  9. "grade": null,
  10. "middle-school": "\"W3C\" Middle School",
  11. "skills": [
  12. "JavaScript",
  13. "Java",
  14. "Python",
  15. "Lisp"
  16. ]
  17. }
  18. */

如果你输入的是字符串,前面的缩进空格就会变成你输入的字符串
image.png
image.png

4、自定义转化规则

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

  1. var xiaoming = {
  2. name: '小明',
  3. age: 14,
  4. gender: true,
  5. height: 1.65,
  6. grade: null,
  7. 'middle-school': '\"W3C\" Middle School',
  8. skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
  9. toJSON: function () {
  10. return { // 只输出name和age,并且改变了key:
  11. 'Name': this.name,
  12. 'Age': this.age
  13. };
  14. }
  15. };
  16. JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'

注意,箭头函数不能用来定义 toJSON()方法。主要原因是箭头函数的词法作用域是全局作用域,在这种情况下不合适。

toJSON()方法可以与过滤函数一起使用,因此理解不同序列化流程的顺序非常重要。

在把对象传给 JSON.stringify()时会执行如下步骤:
(1) 如果可以获取实际的值,则调用 toJSON()方法获取实际的值,否则使用默认的序列化。
(2) 如果提供了第二个参数,则应用过滤。传入过滤函数的值就是第(1)步返回的值。
(3) 第(2)步返回的每个值都会相应地进行序列化。
(4) 如果提供了第三个参数,则相应地进行缩进。

理解这个顺序有助于决定是创建 toJSON()方法,还是使用过滤函数,抑或是两者都用。

函数转换JSON

应该避免在 JSON 中使用函数,函数会失去其作用域,而且您还需要使用 eval( ) 将它们转换回函数。

  1. <script>
  2. var obj = { name: "Bill Gates", age: function () {return 62;}, city: "Seattle" };
  3. obj.age = obj.age.toString();
  4. var myJSON = JSON.stringify(obj);
  5. document.getElementById("demo").innerHTML = myJSON;
  6. </script>

=================

JSON转换成对象

1、基本使用

  1. JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]
  2. JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
  3. JSON.parse('true'); // true
  4. JSON.parse('123.45'); // 123.45

2、第二个参数 (批处理)

  1. var obj = JSON.parse('{"name":"小明","age":14}', function (key, value) {
  2. if (key === 'name') {
  3. return value + '同学';
  4. }
  5. return value;
  6. });
  7. // {name: '小明同学', age: 14}

特别

1、JSON 中不允许日期对象

如果您需要包含日期,请写为字符串。

之后您可以将其转换回日期对象:

  1. <script>
  2. var text = '{"name":"Bill Gates", "birth":"1955-10-28", "city":"Seattle"}';
  3. var obj = JSON.parse(text);
  4. obj.birth = new Date(obj.birth);
  5. document.getElementById("demo").innerHTML = obj.name + ", " + obj.birth;
  6. </script>
  7. //或者用JSON.parse()的第二个参数,是一个处理函数
  8. <script>
  9. var text = '{"name":"Bill Gates", "birth":"1955-10-28", "city":"Seattle"}';
  10. var obj = JSON.parse(text, function (key, value) {
  11. if (key == "birth") {
  12. return new Date(value);
  13. } else {
  14. return value;
  15. }
  16. });
  17. document.getElementById("demo").innerHTML = obj.name + ", " + obj.birth;
  18. </script>

2、JSON 中不允许函数

如果您需要包含函数,请把它写作字符串。

稍后您可以把它转换回函数:

  1. <script>
  2. var text = '{"name":"Bill Gates", "age":"function() {return 62;}", "city":"Seattle"}';
  3. var obj = JSON.parse(text);
  4. obj.age = eval("(" + obj.age + ")");
  5. //eval()是把括号内的字符串当做js语句来使用。如果要直接运行函数,需要加()括号
  6. document.getElementById("demo").innerHTML = obj.name + ", " + obj.age();
  7. </script>

3、undefined

如果是 undefined,则结果中就会删除相应的键。

================

其他应用

1、简单的深拷贝

image.png

直接把一个值转成JSON,然后再转回来,可以实现简单的深拷贝。

但是有问题:
1、函数不行,函数默认转化成JSON是被移除的。
2、undefined也不行,也是被移除
3、Symbol也不行,也是被移除