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

JSON.parse和JSON.stringify 参数详解的更多相关文章

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

    在和后端对接口的时候,遇到了一个问题 就是series里面数据变量进行拼接的时候,data数据里面全部是数值int类型的 但是因为某些需求需要让他进行某个数据之前的数据都为空 我试过用空字符串和und ...

  2. JSON.parse 和 JSON.stringify 详解

    JSON格式,(简写JavaScript Object Notation),是一种用于数据交换的文本格式,书写简单. 基于JavaScript原生语法,能够序列化对象.数组.数值.字符串.布尔值和 n ...

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

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

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

    SpringMVC接受JSON参数详解及常见错误总结 SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一 ...

  5. SpringMVC接受JSON参数详解

    转:https://blog.csdn.net/LostSh/article/details/68923874 SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session ...

  6. js中解析json对象:JSON.parse()用于从一个字符串中解析出json对象, JSON.stringify()用于从一个对象解析出字符串。

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

  7. 有关javascript中的JSON.parse和JSON.stringify的使用一二

    有没有想过,当我们的大后台只是扮演一个数据库的角色,json在前后台的数据交换中扮演极其重要的角色时,作为依托node的前端开发,其实相当多的时间都是在处理数据,准确地说就是在处理逻辑和数据(这周实习 ...

  8. JSON.parse和JSON.stringify方法

    1.JSON.parse(“要转换的数据”) 2.JSON.stringify(“要转化的数据”) 3.首先,两个方法的用法是有差别的: ①.JSON.stringify是从一个对象中解析出字符串 ② ...

  9. JSON对象获取指定元素以及JSON.parse() 与 JSON.stringify() 的区别

    利用 JSON.parse(param) 实现 例: var param = { "name" : "张三", "text" : { &qu ...

随机推荐

  1. c# 类;一维数组;二维数组

    1. 输入邮箱帐号,判断格式是否正确  (1)有且只有一个@          Contains IndexOf ==LastIndexOf  (2)不能以@开头           StartsWi ...

  2. HDU 3829 Cat VS Dog(最大独立集)

    题目大意: 有n只猫,有m只狗.现在有P个学生去参观动物园.每个孩子有喜欢的动物和不喜欢的动物.假如他喜欢猫那么他就一定不喜欢狗(反之亦然). 如果一个孩子喜欢一个动物,那么这个动物不会被移除,若是不 ...

  3. (转载)PHP_Memcache函数详解

    (转载)http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/04/19/2021605.html memcache函数所有的方法列表如下: M ...

  4. 关于cocos2d这个东西

    我是在今年6月份左右接触到cocos2d这个东西的,当时就是想写个小游戏,结果买书的时候误打误撞就买了cocos2d的书. cocos2d是一个开源的游戏引擎,用于构建2d游戏,同时也可以用它写各种图 ...

  5. [Locked] Strobogrammatic Number & Strobogrammatic Number II & Strobogrammatic Number III

    Strobogrammatic Number A strobogrammatic number is a number that looks the same when rotated 180 deg ...

  6. kickstrt脚本for cobbler基于system-config-kickstart配置

    1,由于是基于图形界面来生成ks自动安装脚本,所有图形生成ks脚本的服务器首先需要的就是有X Window System; 要是虚机的可以配个tigervnc-servere来进行操作 不说了直接上命 ...

  7. poj2299

    好吧,看到这个图片就知道是干什么的了,求逆序数- - 可以用线段树,貌似还可以用归并排序,这题应该是考的归并排序,毕竟是递归分治- - 基本上都忘了,再写一写试试吧. AC ///////////// ...

  8. 安装完sql server 后修改计算机名后不能进行发布的订阅的解决办法

    由于需要需要配置一个发布订阅,可是一直报告:" sql server 复制需要有实际的服务器名称才能连接到服务器,不支持通过别名.ip地址或其他任何备用名称进行连接.请指定实际的服务器名称“ ...

  9. php数组和字符串转换

    PHP 中由于数组和字符串这两种变量类型是如此常用,以至于 PHP 具有两个函数,可以在字符串和数组之间互相进行转换. $array=explode(separator,$string); $stri ...

  10. OpenMP与C++:事半功倍地获得多线程的好处

    来源:IIEEG 01-28-2011 在并行计算领域有一个广为流传的笑话——并行计算是未来之事并且永远都是.这个小笑话几十年来一直都是对的.一种类似的观点在计算机架构社区中流传,处理器时钟速度的极限 ...