你所不知道的JSON.parse() 和 JSON.stringify() – 高级用法

这里介绍一下,我主要介绍一下 JSON.parse() 和 JSON.stringify() 的高级用法,可以在实际应用中给我们带来一些方便。

JSON.parse()

JSON.parse() 可以接受第二个参数,它可以在返回之前转换对象值。比如这例子中,将返回对象的属性值大写:

 
 
JavaScript 代码:
  1. const user = {
  2. name: 'John',
  3. email: 'john@awesome.com',
  4. plan: 'Pro'
  5. };
  6.  
  7. const userStr = JSON.stringify(user);
  8.  
  9. const newUserStr = JSON.parse(userStr, (key, value) => {
  10. if (typeof value === 'string') {
  11. return value.toUpperCase();
  12. }
  13. return value;
  14. });
  15.  
  16. console.log(newUserStr); //{name: "JOHN", email: "JOHN@AWESOME.COM", plan: "PRO"}

注:尾随逗号在JSON 中无效,所以如果传递给它的字符串有尾随逗号,JSON.parse()将会抛出错误。

JSON.stringify()

JSON.stringify() 可以带两个额外的参数,第一个是替换函数,第二个间隔字符串,用作隔开返回字符串。

参数:

  • value : 将要转为JSON字符串的javascript对象。
  • replacer :该参数可以是多种类型,如果是一个函数,则它可以改变一个javascript对象在字符串化过程中的行为, 如果是一个包含 String 和 Number 对象的数组,则它将作为一个白名单.只有那些键存在域该白名单中的键值对才会被包含进最终生成的JSON字符串中.如果该参数值为null或者被省略,则所有的键值对都会被包含进最终生成的JSON字符串中。
  • space :该参数可以是一个 String 或 Number 对象,作用是为了在输出的JSON字符串中插入空白符来增强可读性. 如果是Number对象, 则表示用多少个空格来作为空白符; 最大可为10,大于10的数值也取10.最小可为1,小于1的数值无效,则不会显示空白符. 如果是个 String对象, 则该字符串本身会作为空白符,字符串最长可为10个字符.超过的话会截取前十个字符. 如果该参数被省略 (或者为null), 则不会显示空白符

替换函数可以用来过滤值,因为任何返回 undefined 的值将不在返回的字符串中:

 
 
JavaScript 代码:
  1. const user = {
  2. id: 229,
  3. name: 'John',
  4. email: 'john@awesome.com'
  5. };
  6.  
  7. function replacer(key, value) {
  8. console.log(typeof value);
  9. if (key === 'email') {
  10. return undefined;
  11. }
  12. return value;
  13. }
  14.  
  15. const userStr = JSON.stringify(user, replacer);
  16. // "{"id":229,"name":"John"}"

传入一个间隔参数的示例:

 
 
JavaScript 代码:
  1. const user = {
  2. name: 'John',
  3. email: 'john@awesome.com',
  4. plan: 'Pro'
  5. };
  6.  
  7. const userStr = JSON.stringify(user, null, '...');
  8. // "{
  9. // ..."name": "John",
  10. // ..."email": "john@awesome.com",
  11. // ..."plan": "Pro"
  12. // }"

toJSON方法

如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为:不是那个对象被序列化,而是调用 toJSON 方法后的返回值会被序列化

 
 
JavaScript 代码:
  1. var obj = {
  2. foo: 'foo',
  3. toJSON:function(){
  4. return 'bar';
  5. }
  6. }
  7. JSON.stringify(obj);//'"bar"'
  8. JSON.stringify({x:obj});//'{"x":"bar"}'

利用toJSON方法,我们可以修改对象转换成JSON的默认行为。

用 JSON.stringify 来格式化对象

在实际使用中,我们可能会格式化一些复杂的对象,这些对象往往对象内嵌套对象。直接看起来并不那么直观,结合上面的的 replacer 和 space 参数,我们可以这样格式化复杂对象:

 
 
JavaScript 代码:
  1. var censor = function(key,value){
  2. if(typeof(value) == 'function'){
  3. return Function.prototype.toString.call(value)
  4. }
  5. return value;
  6. }
  7. var foo = {bar:"1",baz:3,o:{name:'xiaoli',age:21,info:{sex:'男',getSex:function(){return 'sex';}}}};
  8. console.log(JSON.stringify(foo,censor,4))

实际返回的字符串,记住是字符串,如下:

 
 
JavaScript 代码:
  1. {
  2. "bar": "1",
  3. "baz": 3,
  4. "o": {
  5. "name": "xiaoli",
  6. "age": 21,
  7. "info": {
  8. "sex": "男",
  9. "getSex": "function (){return 'sex';}"
  10. }
  11. }
  12. }

关注WEB前端开发官方公

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值