JSON.stringify详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON.stringify详解相关的知识,希望对你有一定的参考价值。

参考技术A

当我们使用 JSON.stringify() 序列化一个值为JSON字符串,只有 JSON安全的值 才可以通过 JSON.stringify() 转换为字符串。那么,什么是 JSON安全的值 ?能够有效用JSON形式表示的任何值。

非JSON安全的值,例如: undefined 、 function 和 symbol 以及循环引用的object(对象结构的属性引用通过创建彼此,构成一个无限循环)。对一个标准的JSON结构来说,这些值都是非法的,主要是因为它们无法移值到其他支持JSON的语言中。

当 JSON.stringify() 遇到 undefined 、 function 和 symbol 的时候,会自动忽略它们的值,如果这样的值在数组中会被替换成 null (这样数组的索引信息就不会被改变)。如果这样的值出现在对象的属性中,那这个属性会被排除掉。

JSON字符串有一个特殊的行为,如果一个对象定义了 toJSON() 方法,那这个方法先被调用,并且将它返回的值进行序列化。

如果将一个含有非法JSON值的对象序列化成JSON字符串,需要定义一个 toJSON() 方法,用于返回该对象的JSON安全版本。

JSON.stringify()第二个参数是个可选参数,被称为replacer。这个参数可以是数组或者函数。它提供了一个过滤机制制定了应该或者不应该包含哪些属性,从而实现了对象可定制的递归序列化,这种做法和toJSON()如何序列化准备一个值很相似。

如果replacer是一个数组,它应该是一个字符串数组,每一个值都指定了对象的属性名称,代表属性应该被加入到序列化中,如果一个属性不在这个列表中,它会被跳过。

如果replacer是一个函数,它首先会被该对象调用一次,然后该对象的每个属性会调用一次,每次都会给这个函数传递两个值,key和value。想在序列化过程中跳过某个key,只需要返回undefined,否则返回提供的value。

第三个可选的参数也可以传递给JSON.stringify(),被称为space,被用作缩进,是为了使得输出有格式更加漂亮。space可以是一个正整数,指定每层缩进应该缩进多少个空格。或者space也可以是个字符串,其值的前十个字符被用于每个缩进层次。

010天JSON.stringify()详解

JSON.stringify()除了要序列化的js对象外,还可以接受另外两个参数,这两个参数用于指定以不同的方式序列化js对象。第一个参数是个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩紧。单独或组合使用这两个参数,可以更全面深入地控制JSON的序列化。

1.过滤结果

如果过滤器参数是数组,那么JSON.stringify()的结果中将只包含数组中列出的属性。

let book = {
    ‘title‘:‘profession‘,
    ‘authors‘:[‘yk‘],
    edition:3,
    year:2020
}

let jsonText = JSON.stringify(book,[‘title‘,‘edition‘]);

得到的jsonText为:

{‘title‘:‘profession‘,edition:3}

看下面一个传入函数的例子

let book = {
    ‘title‘:‘profession‘,
    ‘authors‘:[‘yk‘],
    edition:3,
    year:2020
}

let 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;
        
    }
});

函数的时候传入两个,key和value,属性名key只能是字符串,如果函数返回undefined,那么相应的属性会被忽略。

所以上面得到的结果是

{‘title‘:‘profession‘,‘authors‘:‘yk‘,year:5000}

二。JSON.stringify的字符串缩进功能

JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那么它表示的是每个级别缩进的空格数。例如要在每个级别缩进4个空格:

let book = {
    ‘title‘:‘profession‘,
    ‘authors‘:[
        ‘yk‘
    ],
    edition:3,
    year:2020
}

let jsonText = JSON.stringify(book,null,4);

得到的jsonText是:

let book = {
        ‘title‘:‘profession‘,
        ‘authors‘:[
            ‘yk‘
        ],
        edition:3,
        year:2020
}
?这个数值?最大不能超过10,超过10的按照10处理。


有意思的来了,如果缩进参数是一个字符串而非数值,那么这个字符串会被当作缩进符(不再用空格)
let jsonText = JSON.stringify(book,null,"--");

得到jsontext

{
--‘title‘:‘profession‘,
--‘authors‘:[
----‘yk‘
--],
--edition:3,
--year:2020
}

同样缩紧字符不能超过10个,超过10个,结果也只会出现前10个字符

扫码加群,每日更新一篇前端技术文章一起成长。

技术图片

以上是关于JSON.stringify详解的主要内容,如果未能解决你的问题,请参考以下文章

JSON.parse和JSON.stringify 参数详解

010天JSON.stringify()详解

JSON.stringify方法参数详解

JS JSON.stringify 详解

js之JSON.stringify()使用详解

Js中JSON.stringify()与JSON.parse()与eval()详解及使用案例