JSON.parse和JSON.stringify这两个浏览器自带(IE6/7除外)的方法平常我们经常用到,但是一般都只是用到了他们的第一个参数,比如字符串转对象:JSON.parse('{}')   对象转字符串:JSON.stringify({})

今天特意看了下这两个方法的定义,第二个可选参数也是非常有用。

1. JSON.parse(text[, reviver])

text :     要被解析成JSON对象的字符串

reviver : 如果是一个函数,则规定了原始值如何被解析改造,在被返回之前。 function(key, value){ return value;}

如果指定了 reviver 函数,则解析出的 JavaScript 值(解析值)会经过一次转换后才将被最终返回(返回值)

按照key的顺序从左到右,如果value为对象则先遍历对象里的属性,最里层的属性先开始,一级级往外,最终到达顶层,也就是解析值本身分别的去调用 reviver 函数

如果 reviver 返回 undefined,则当前属性会从所属对象中删除,比如:

JSON.parse('{"p": 5}', function (k, v) {if(k === '') return v;     // 如果到了最顶层,则直接返回属性值,(最顶层key为空字符串)return v * 2;              // 否则将属性值变为原来的 2 倍。
});                            // { p: 10 }JSON.parse('{"1": 1, "2": 2,"3": {"4": 4, "5": {"6": 6}}}', function (k, v) {console.log(k); // 输出当前的属性名,从而得知遍历顺序是从内向外的,// 最后一个属性名会是个空字符串。return v;       // 返回原始属性值,相当于没有传递 reviver 参数。
});// 1
// 2
// 4
// 6
// 5
// 3
// ""\

2.  JSON.stringify(value [, replacer] [, space])

value :       要转换的值

replacer : 可选参数,只能为函数或数组。

如果replacer是函数则表示转换前每个属性会先调用该函数。function(key, value){ return value;}  如果此函数返回 undefined,则排除该成员。和                                 JSON.parse一样根对象的键是一个空字符串:""。

如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。    成员的转换顺序与键在数组中的顺序一样。    当 value 参数也为数组时,将忽略 replacer 数组。

space    : 可选。向返回值 JSON 文本添加缩进、空格和换行符以使其更易于读取。

如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格。    如果 space 大于 10,则文本缩进 10 个空格。

如果 space 是一个非空字符串(例如“\t”),则返回值文本在每个级别中缩进字符串中的字符。

如果 space 是长度大于 10 个字符的字符串,则使用前 10 个字符。

如果 value 具有 toJSON 方法,则 JSON.stringify 函数将使用该方法的返回值。    如果 toJSON 方法的返回值为 undefined,则不转换成员,这使对象能够确定自己的 JSON 表示形式。将不会转换不具有 JSON 表示形式的值,例如 undefined。    在对象中,将丢弃这些值。    在数组中,会将这些值替换为 null。

字符串值以引号开始和结束。    所有 Unicode 字符可括在引号中,但必须使用反斜杠进行转义的字符除外。    以下字符的前面必须是反斜杠:

  • 引号 (")

  • 反斜杠 (\)

  • 退格键 (b)

  • 换页符 (f)

  • 换行符 (n)

  • 回车符 (r)

  • 水平制表符 (t)

  • 四个十六进制数字 (uhhhh)

在序列化过程中,如果 value 参数对应有 toJSON 方法,则 JSON.stringify 将首先调用 toJSON 方法。    如果该方法不存在,则使用原始值。    接下来,如果提供 replacer 参数,则该值(原始值或 toJSON 返回值)将替换为 replacer 参数的返回值。    最后,根据可选 space 参数向该值添加空格以生成最终的 JSON 文本。

eg:第二个参数为数组

var contact = {};
contact.firstname = "Jesper";
contact.surname = "Aaberg";
contact.phone = ["555-0100", "555-0120"]; var memberfilter = [];
memberfilter[0] = "surname";
memberfilter[1] = "phone";
var jsonText = JSON.stringify(contact, memberfilter, "\t");
document.write(jsonText);
// Output:
// { "surname": "Aaberg", "phone": [ "555-0100", "555-0120" ] }

第二个参数为函数:

var continents = [];
continents[0] = "Europe";
continents[1] = "Asia";
continents[2] = "Australia";
continents[3] = "Antarctica";
continents[4] = "North America";
continents[5] = "South America";
continents[6] = "Africa"; var jsonText = JSON.stringify(continents, replaceToUpper); function replaceToUpper(key, value) {     if (key=='') {return value;} //默认会将整个对象传进来,先过滤掉return value.toString().toUpperCase();
} //Output:
// "EUROPE,ASIA,AUSTRALIA,ANTARCTICA,NORTH AMERICA,SOUTH AMERICA,AFRICA" 

对象含有toJSON属性

var contact = {};
contact.firstname = "Jesper";
contact.surname = "Aaberg";
contact.phone = ["555-0100", "555-0120"]; contact.toJSON = function() { var replacement = {}; for (var val in this)  //当前属性所属的对象会作为 this 值{ if (typeof (this[val]) === 'string') replacement[val] = this[val].toUpperCase(); else replacement[val] = this[val] } return replacement;
}; var jsonText = JSON.stringify(contact);
document.write(jsonText); // Output:
'{"firstname":"JESPER","surname":"AABERG","phone":["555-0100","555-0120"]}' 

如果对象有toJSON属性方法,而且第二个参数又是函数,则会先调用对象的toJSON属性方法,然后把返回的值再调用第二个函数参数,最后得到的值即为JSON.stringify返回的值:

var a = {'a': 'aa','aa': 'aaa','toJSON': function() {var obj = {};for (var i in this) {   //toJSON属性也会加进来obj[i] = this[i] + 'xxx'}return obj;}
};
var b = JSON.stringify(a,
function(k, v) {if (k == '') {return v;} else {return v + 'ddd'}
});
console.log(b)
//输出:
{"a": "aaxxxddd","aa": "aaaxxxddd","toJSON": "function (){var obj={};for(var i in this){obj[i]=this[i]+'xxx' } return obj;}xxxddd"
}

参考:

https://technet.microsoft.com/zh-cn/sysinternals/cc836459

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

转载于:https://www.cnblogs.com/lmh2072005/p/5985431.html

JSON.parse和JSON.stringify 参数详解相关推荐

  1. php json.parse,JSON.parse()与JSON.stringify()和eval()使用方法详解

    这次给大家带来JSON.parse()与JSON.stringify()和eval()使用方法详解,JSON.parse()与JSON.stringify()和eval()使用的注意事项有哪些,下面就 ...

  2. JS/JavaScript中解析JSON --- JSON.parse()、JSON.stringify()以及$.parseJSON()使用详解

    JS/JavaScript中解析JSON --- JSON.parse().JSON.stringify()以及$.parseJSON()使用详解 现在JSON格式在web开发中非常重要,特别是在使用 ...

  3. 详解JSON.parse 和 JSON.stringify

    文章目录 JSON.parse JSON.parse 语法 reviver 参数 JSON.parse 特性 解析的其他方法 JSON.stringify JSON.stringify 语法 repl ...

  4. SpringMVC接受JSON参数详解及常见错误总结我改

    SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP.所以把一个练手项目的前 ...

  5. daemon.json配置参数详解

    ** daemon.json配置参数详解 ** 背景 docker安装的时候没有daemon.json这个文件 一般情况下,daemon.json中配置的项目参数,在启动参数中同样适用.(有些可能会冲 ...

  6. JSON.parse()和JSON.stringify()的区别

    一.JSON.parse()用于从一个字符串中解析出json对象. 举例: var str = '{"name":"test","age": ...

  7. JSON.parse()、JSON.stringify()和eval()的作用

    浅谈JSON.parse().JSON.stringify()和eval()的作用 相信大家对于JSON应该不陌生,度娘对这个名词的解释大致如下: "JSON(JavaScript Obje ...

  8. js JSON.parse和JSON.stringify

    JSON.parse 将json字符串转换成对象 JSON.parse(text[, reviver]) reviver可选参数 var students = '{"id": 1, ...

  9. JSON.parse()、JSON.stringify、 parseInt()

    1.JSON.parse() JSON.parse()是Javascript中一个常用的 JSON 转换方法,JSON.parse()可以把JSON规则的字符串转换为JSONObject,JSON.p ...

最新文章

  1. python绘制灰度图片直方图-python数字图像处理实现直方图与均衡化
  2. fem求解二维时谐电磁场问题
  3. 强化学习(八)价值函数的近似表示与Deep Q-Learning
  4. 推荐CVer的总结 | 性能最强的One-stage目标检测算法
  5. Python 中使用help()命令后如何退出
  6. c语言,期末复习之求多项式分式数列 1+1/2+2/3+3/5 ...........前n项和
  7. Dart与系统进程交互
  8. Rokid祝明铭:大腿我们不抱,人机交互产品形态未定 | 变局者
  9. 利用FrameLayout连接一组view实现流畅的左右滑动
  10. 基于SpringBoot+Mybatis+Thymeleaf的信息管理系统
  11. linux 联机游戏下载,星露谷物语多人联机版
  12. IOS 视屏开发之AVPlayer的基本使用
  13. 关于ztree的使用
  14. 【C++ 程序】 复数类 (Complex)
  15. 青龙-稳定脚本记录(更新中)
  16. 飞桨首款韩女团小卡扭蛋机
  17. 畜牧兽医职称需要考英语和计算机,畜牧兽医专业技术职称考试试题
  18. vscode新手注意事项(字体间隔,报错提示波浪线,头文件路径,opencv头文件路径)
  19. Vue.js中的v-model指令(双向绑定)
  20. electron-vue通过配置文件设置baseUrl

热门文章

  1. WebService的基本概念:java webservice,什么是webservice
  2. Lady Bird
  3. Protocol Buffer 序列化
  4. C++之STL理论基础
  5. DAL调用SP时出现的异常处理
  6. 缓存服务器在Linux下的运用
  7. FLEX组件AnyChart实例教程.
  8. java对象占用内存大小?
  9. java中的args参数
  10. 猿辅导python面试_猿辅导面试经历—个人感受