JSON操作

152 阅读4分钟

前言

在日常开发工作中,我们时常要用到JSON.parseJSON.stringify 对JSON类型的数据进行解析和序列化.下面分别对这两个方法进行说明

一、 JSON.parse

一般使用该方法时,时常只传一个参数即要解析的json字符串,实际上,该方法还有另外一个可选参数,该参数接收一个函数,叫做还原函数reviver, 用来处理解析过程中值。reviver函数接收两个参数,一个键一个值,函数需要有返回值返回的值就是解析后要接收的

如果还原函数返回 undefined,则表示要从结果中删除相应的;如果返回其他值,则将该值插入到结果中

如下实例,用来处理日期的回显转换

var book = {
    title: "Professional JavaScript",
    authors: [
        "Nicholas C. Zakas"
    ],
    edition: 3,
    year: 2011,
    releaseDate: new Date(2011, 11, 1)
};

var jsonText = JSON.stringify(book);

var bookCopy = JSON.parse(jsonText, function(key, value){

        if (key == "releaseDate"){

            return new Date(value);

        } else {

            return value;

        } 
   })
   
alert(bookCopy.releaseDate.getFullYear());

二、JSON.stringify

一般使用该方法,是将对象序列化字符串,默认情况下(只传1个参数),在序列化JS对象时,要注意:所有函数及原型成员都会被有意忽略,值为undefined 的任何属性也都会被跳过结果中最终都是值为有效 JSON 数据类型的实例属性。所以再结合JSON.parse进行深copy时,要确定复制的对象上值的类型,才能使用该方案。

2.1 序列化参数

实际上,JSON.stringify还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化 JavaScript 对象。总共能接收3个参数

  • 参数2
    • 作用:过滤器,用来过滤对象中指定的属性,被拦截住的属性将不显示在序列化结果中
    • 类型:Array|Function|null
      • Array: 数组中的值,将留下下
      • Function:接收两个参数,属性的键名和属性值,根据属性(键)名可以知道应该如何处理要序列化的对象中的属性。属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串。函数的返回值就是序列化后的值,如果返回undefined,则该属性将会被忽略。
      • null: 按照默认方式使用
  • 参数3
    • 作用:字符串缩进,用来美化序列化后的字符串
    • 类型:String|Number
      • String: 将按照给定的字符串作为缩进的格式
      • Number: 表示用空格进行缩进,值为缩进的空格数,例如: 2, 表示2个空格的缩进

2.1.1 过滤器的使用

var book = {
        title: "Professional JavaScript",
        authors: [
            "Nicholas C. Zakas"
        ],
        edition: 3,
        year: 2011
};
// Array
var jsonText = JSON.stringify(book, ["title", "edition"]);
{"title":"Professional JavaScript","edition":3}
//JSON.stringify()的第二个参数是一个数组,其中包含两个字符串:"title"和"edition"。
//这两个属性与将要序列化的对象中的属性是对应的,因此在返回的结果字符串中,就只会包含这两个属性


//Function
// 注意点: 
//1.Function 如果返回都是同一个字符串值,那函数只进入一次,且只返回一个值,并不是返回过滤属性且属性值都是该值
//2. 返回值不能是对象,不然会死循环,
//3.函数第一次进入接收到的value值其实是整个对象,key值为空,从第二次进入后才是各个属性名和属性值
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;
        }

});

2.1.2 美化字符串

var book = {
        title: "Professional JavaScript",
        authors: [
            "Nicholas C. Zakas"
        ],
        edition: 3,
        year: 2011
};
var jsonText = JSON.stringify(book, null, 4);
// 保存后
{
    "title": "Professional JavaScript",
    "authors": [
        "Nicholas C. Zakas"
     ],
    "edition": 3,
    "year": 2011
}

2.2 toJSON方法

有时候,JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。在这些情况下, 可以给对象定义 toJSON()方法,返回其自身的 JSON 数据格式。原生 Date 对象有一个 toJSON()方法, 能够将JavaScript的Date 对象自动转换成ISO 8601日期字符串(与在Date 对象上调用toISOString() 的结果完全一样)。可以为任何对象添加 toJSON()方法

var book = {
        title: "Professional JavaScript",
        authors: [
            "Nicholas C. Zakas"
        ],
        edition: 3,
        year: 2011,
        toJSON: function(){
            return this.title;
        }
};
var jsonText = JSON.stringify(book);
// 序列化结果,将只返回 title