序列化

    让我们先把小明这个对象序列化成JSON格式的字符串:

    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"]}'

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

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

    结果:

    {

    "name": "小明",

    "age": 14,

    "gender": true,

    "height": 1.65,

    "grade": null,

    "middle-school": "\"W3C\" Middle School",

    "skills": [

    "JavaScript",

    "Java",

    "Python",

    "Lisp"

    ]

    }

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

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

    结果:

    {

    "name": "小明",

    "skills": [

    "JavaScript",

    "Java",

    "Python",

    "Lisp"

    ]

    }

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

    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"

    ]

    }

    如果我们还想要精确控制如何序列化小明,可以给 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}'