一篇搞懂JSON

2018-09-08  本文已影响0人  花泽冒菜

概况

JSON,全称JavaScript Object Notation(JavaScript 对象表示法),是一种超轻量级数据交换格式,可用于多种程序语言,使用UTF-8字符编码格式,是JavaScript语法的子集。

数据类型

JSON格式支持的数据类型可以分为三类:

JSON与JS对象互相转换

JSON是JS的一个全局对象,有两个方法:stringify()和parse()。

序列化 JS --> JSON

方法:JSON.stringify(object, function(key, value), ' '),输出一个字符串,默认不包含空格或缩进,object中值为undefined的属性会被忽略。

var xiaoming = {
  name: '小明',
  age: 14,
  gender: true,
  height: 1.65,
  grade: null,
  'middle-school': '\"W3C\" Middle School',
  skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
JSON.stringify(xiaoming);  
// 输出结果:
"{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}"
var xiaoming = {
  name: '小明',
  age: 14,
  gender: true,
  height: 1.65,
  grade: null,
  'middle-school': '\"W3C\" Middle School',
  skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
  toJSON: function () {  // 只输出name和age
    return { 
      'Name': this.name,
      'Age': this.age
    };
  }
};
JSON.stringify(xiaoming);  // "{"Name":"小明","Age":14}"
JSON.stringify(xiaoming, ['name', 'skills'], '  ');
// 输出结果:
"{
  "name": "小明",
  "skills": [
    "JavaScript",
    "Java",
    "Python",
    "Lisp"
  ]
}"

(2)也可以是一个函数,参数为key, value(第一次调用key为空字符串value为目标对象),用于格式化输出的数据(例如转换大小写)

function convert(key, value) {
  if (typeof value === 'string') {
    return value.toUpperCase();
  }
  return value;
}
JSON.stringify(xiaoming, convert, '  ');
{
  "name": "小明",
  "age": 14,
  "gender": true,
  "height": 1.65,
  "grade": null,
  "middle-school": "\"W3C\" MIDDLE SCHOOL",
  "skills": [
    "JAVASCRIPT",
    "JAVA",
    "PYTHON",
    "LISP"
  ]
}

(3)也可以是null

JSON.stringify(xiaoming, null, '  ');
// 输出结果:
"{
  "name": "小明",
  "age": 14,
  "gender": true,
  "height": 1.65,
  "grade": null,
  "middle-school": "\"W3C\" Middle School",
   "skills": [
    "JavaScript",
    "Java",
    "Python",
    "Lisp"
  ]
}"
JSON.stringify(xiaoming, ['name', 'skills'], '--');
// 输出结果:
"{
--"name": "小明",
--"skills": [
----"JavaScript",
----"Java",
----"Python",
----"Lisp"
--]
}"

注意执行顺序:目标对象的toJSON()方法、参数2、序列化、格式化(参数3)

反序列化 JSON --> JS

方法:JSON.parse(string, function(key, value));

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 obj = JSON.parse("{"name":"小明","age":14}", function (key, value) {
  if (key === 'name') {
    return value + '同学';
  }
  return value;
});
JSON.stringify(obj); // Object {name: '小明同学', age: 14}

拓展

早期使用js中的一个函数eval()来解析JSON数据,但eval()的参数为语句,而JSON属于JS语法的子集,可能执行一些恶意代码,所以有风险。ES5中定义了全局对象JSON,专门用来解析JSON。


Reference:

1.https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434499490767fe5a0e31e17e44b69dcd1196f7ec6fc6000
2.《JavaScript高级程序设计(第3版)》

上一篇 下一篇

猜你喜欢

热点阅读