json.stringify()(JSON.stringify详解)
在这个信息爆炸的时代,了解json.stringify()和JSON.stringify详解的重要性不言而喻。本文将为您带来全面的解读,助您在这个领域中游刃有余。
关于JSON.stringify的妙用
我们都知道JSON对象有两个方法,一个是parse,用来把json字符串转换为json对象,另一个是stringify,用来把json对象转换为json字符串,可是stringify其实还有其它作用。
比如说有一个对象{a:1,b:2,c:3,d:4,e:5},现在我们只需要b属性和e属性,可以这样来操作
JSON.stringify(value, replacer, space)语法
将要序列化成一个JSON字符串的值。
如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON字符串中;如果该参数为null或者未提供,则对象所有的属性都会被序列化。
指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(字符串的前十个字母),该字符串将被作为空格;如果该参数没有提供(或者为null)将没有空格。
JSON.stringify详解
当我们使用 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也可以是个字符串,其值的前十个字符被用于每个缩进层次。
“JSON.parse”和“JSON.stringify”有什么区别
parse用于从一个字符串中解析出json对象。
例如:var str='{"name":"cpf","age":"23"}',经 JSON.parse(str)得到: Object: age:"23" name:"cpf" _proto_:Object
ps:单引号写在{}外,每个属性都必须双引号,否则会抛出异常。
2.stringify用于从一个对象解析出字符串。
例如; var a={a:1,b:2},经 JSON.stringify(a)得到:“{“a”:1,"b":2}”。
JSON.stringify,这个函数的作用主要是为了系列化对象的。(或者说是将原来的对象转换为字符串的,如json对象)。
首先定义一个json对象,var jsonObject={"UserID":"1","UserName":"xiaozhang"};,使用alert(jsonObject)弹出一下,显示: [Object Object],然后调用一下JSON.stringify一下,将json对象转换为json字符串。
浅谈JS中的JSON.stringify() 和 JSON.parse()
我们知道, JSON.stringify()和 JSON.parse()是一对处理JSON数据的方法,前者是将JSON对象序列化为字符串,而后者是将JSON字符串解析为JSON对象。
但是你有较为深入地去了解过它们吗?它们分别可以传入几个参数以及每个参数对应的作用是什么你知道吗?
它可以传入三个参数,参数1是需要字符串化的对象,参数2是用于指定对象序列化过程中需要被处理的属性,参数3是用于指定输出字符串的缩进格式。后两个参数是可选的,而我们最常用的就是只传一个参数。
需要字符串化的对象,且该对象须是安全的JSON对象,而对于不安全的JSON对象都不能被正常序列化。
何为不安全的JSON对象?
undefined、function、symbol和包含循环的引用的对象都不符合JSON结构标准,所以它们本身以及包含它们的对象都是不安全的JSON对象。
那么对于不安全的JSON对象, JSON.stringify()会如何处理它们呢?
单独处理它们,直接返回 undefined。
包含它们的对象,自动将其忽略。例如:
包含它们的数组,自动将其转成 null。例如:
如果两个对象之间互相引用,形成一个无限循环,那么无论对其中的哪个对象进行JSON字符串化都会直接报错!例如:
对该类对象进行JSON字符串化,会先调用 toJSON()方法,然后用它的返回值来进行序列化。例如:
正常按照前面讲的忽略 function来说应该要返回"{"a":1}"才对嘛,为啥是 undefined呢?这就是因为包含 toJSON()方法的缘故,只要有它,直接就处理它的返回值。上例中因为 toJSON()方法返回值是个不安全的JSON对象,所以就按照前面①中讲的方式来处理了。
再看个例子你就明白了:
用于指定对象序列化过程中需要被处理的属性,它可以是数组或函数。
必须是字符串数组,其中包含序列化要处理的对象的属性名称,除此之外的其他属性会被忽略。例如:
该函数会先调用对象本身,然后遍历对象的每个属性。函数传入两个参数,第一个为属性名(key),第二个为属性值(value)。开始调用对象本身时,第一个参数key为空字符串,第二个参数value为对象本身,而此时函数的返回值会直接替换原对象。而后每次遍历对象属性时的返回值都会替换原有该属性的值。例如:
看到了吗?每一次遍历返回值都可能会对最终的处理结果产生影响。我们再看个例子:
用于指定输出字符串的缩进格式。它可以是正整数,也可以是字符串。当是正整数时,它指定的是每一级缩进的字符数,当它是字符串时,该字符串的前十个字符将会被用于每一级的缩进。例如:
最后输出结果为:
可以看到,无论传入的字符串有多长,最终只会取前十个字符用于缩进填充。
了解完了 JSON.stringify(),我们再来看看它的逆操作函数 JSON.parse()。
它可以传入两个参数,参数1是需要被解析的字符串,参数2是用于修改解析生成的原始值。后一个参数是可选的,而我们最常用的就是只传一个参数。
该参数必须是符合JSON规范的字符串,如果是其他类型,则会被强制类型转换成字符串格式,如果不符合JSON规范,则会报错!例如:
注意JSON字符串中的key必须有双引号(单引号也不行),不然是不符合JSON规范的。
该参数是个函数,作用类似于前面 JSON.stringify()的第二个参数replacer,同样是对属性进行遍历,同样有key和value两个参数。我们具体来看个例子:
看到了吗?前面属性的遍历可以修改输出对象的属性值,但最终输出的值关键还是取决于key为空字符串时的返回值,它可以将之前所有的努力都变为徒劳!
json.stringify()和JSON.stringify详解的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!