JSON.parse和JSON.stringify 参数详解

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么用java实现打字功能_怎么用JAVA编写一个打字游戏

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这个帖子是一年前发的,当时对Java也不是很懂,我看大家都对这个感兴趣,我把代码改了一下,发布出来,其实还有很多的地方还没有完善...,这个只能算一个Demo&#…

从pg_hba.conf文件谈谈postgresql的连接认证

最近一直在弄postgresql的东西,搭建postgresql数据库集群环境什么的。操作数据库少不得要从远程主机访问数据库环境,例如数据库管理员的远程管理数据库,远程的客户存取数据库文件。 而在postgresql中配置文件pg_hba.conf就是用来设置访问认证…

pythonfor循环列表排序_Python Day4950(for循环语句整理)

班长的图Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。一、Python 循环遍历列表元素1.for i in list():2.for i in enumerate(list):2.for i in range(len(list)):for i in list():for i in enumerate(list):for i in range(len(list)):二、Pyt…

Java异常处理深入理解_关于java异常处理机制的深入理解.doc

关于java异常处理机制的深入理解.doc 关于JAVA异常处理机制的深入理解1引子TRYCATCHFINALLY恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想…

14款经典的MySQL客户端软件

1. EMS MySQL Manager强大的mysql管理工具,允许用户通过图形界面创建或编辑数据库对象,并提供通过sql语句管理用户和权限,通过图形界面建立sql语句,自动生成html格式的数据库文档,导入/导出数据,查看/编辑b…

java 设计一个动物类_Java课程设计(动物换位)

【实例简介】是一个关于Java课程设计的一个游戏,这是一个动物换位的游戏,是在前人的基础上改进的。不好请见谅!【实例截图】【核心代码】112df6fb-1189-4bc0-a501-6dd5839cb8dc└── 【Java课程设计】├── Java课程设计.doc└── 动物换位…

(机器学习/计算机视觉/深度学习)代码

PRML 一书的 matlab implementation(官网:http://prml.github.io/)一位计算机视觉学术牛人的 Github(C code)(可作为自己的敲门砖,.sln 项目,也即 vs 平台下完成)0. 图像…

处理字符集中的算式问题

最近遇到一个编程题.题目是这样的:  接收一个字符型的算式,如"12*34",按顺序,每遇到一个数字,则进行运算至该数字的结果.比如传入的是"12*34",那么结果是1,3,7,11. 有的地方表达可能不一样,我的理解记下来的题目就是这样.回来后写了下,用java语言处理的.…

java 格式化 布尔型_这么久才知道Java中的format很强大!

Java中允许我们对指定的对象进行某种格式化,从而得到我们想要的格式化样式。Format首先介绍java.text包中的FormatForamt是一个抽象基类,其具体子类必须实现format(Object obj, StringBuffer toAppendTo, FieldPosition pos)和parseObject(String source…

【腾讯优测干货分享】从压测工具谈并发、压力、吞吐量

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d914e07b7fc1c26a0cf7c 前言 随着部门业务的拓展,我们有了很多性能测试的机会,但在实战中,慢慢发现…

java 提高性能的 容器库_容器隔离性带来的问题--容器化Java应用比虚机启动速度慢...

引发的问题同等配置下,虚机中的java 服务的启动速度,要比容器快很多(将近两倍)实测数据在同是1c1g的虚机和容器中,虚机启动时间大概在1min20s,容器启动时间大概在2min40s。排查思路怀疑网络最开始怀疑是网络问题,因为业…

MySQL5.6 PERFORMANCE_SCHEMA 说明

背景: MySQL 5.5开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.5默认是关闭的,…

php api查询开发,PHP开发API接口(注册、登录、查询用户信息)的实例代码

本节主要内容:php开发API接口的实现代码一、PHP API接口的服务端部分复制代码 代码示例:/*** PHP开发API接口 服务端* edit: www.jbxue.com*/require conn.php;header(Content-Type:text/html;charsetutf-8);$action $_GET[action];switch ($action) {//注册会员ca…

json字符串与json对象之间的转换

字符串转对象(strJSON代表json字符串) var obj eval(strJSON); (运用时候需要除了eval()以外需要json.js包) var obj strJSON.parseJSON(); var obj JSON.parse(strJSON); json对象转字符串(obj代表json对象) var str obj.toJSONS…

ubuntu php 解析,ubuntu运行后台php服务详解

创建一个php服务脚本,该脚本负责抓取mqtt等通信记录,并且保存到数据库。平时,我们只要在服务器端开个终端,就可以运行代码,去抓数据,但是将终端关闭后,就无法抓取数据了。守护进程(daemon)就是一…

04_类与对象_课程动手动脑问题以及课后实验性问题及解答集锦

Answer: 动手动脑: 1——以下代码为何无法通过编译?哪儿出错了? Answer: 因为类Foo的构造函数是有一个参数的,所以我们在new一个Foo类的对象时必须赋予一个符合条件的实参。 2—— 请运行TestStaticInitializeBlock.java示例&…

php如果能编译就完美了,centos7 完美编译PHP7 php-7.2.10.tar.gz

1.下载去官网下载。2、上传并解压tar -zxvf php-7.2.10.tar.gz3、进入文件夹cd php-7.2.104、安装相关依赖包yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel gd gd-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel e2fsprogs e…

UVA - 11246 - K-Multiple Free set(容斥原理)

题意&#xff1a;给定n&#xff08;1 < n < 10^9&#xff09;和k&#xff08;1 < k < 100&#xff09;&#xff0c;从1~n中选尽量多的整数&#xff0c;使的任意两个整数之间都不是k倍的关系。 容斥原理&#xff0c;&#xff08;例如n 20&#xff0c;k 3&#xff…

2017年php还能火多久,PHP还会火吗?

据不完全数据得知&#xff0c;我国对PHP人才非常紧缺&#xff0c;大约每年有50万人左右。伴随着近几年信息化&#xff0c;智能化&#xff0c;网络化的发展&#xff0c;PHP的发展前景也是不可估量的&#xff0c;那么&#xff0c;你知道是什么影响PHP继续火热的吗?下面我们就来分…

[JZOJ P1288] [DP]矩阵取数

kaike 传送门 07年noipT3&#xff1f; 要我写我肯定放弃 嗯没错就是这么果断 据说要 高精 DP 状态&#xff1f; 举例说明&#xff0c;假设有矩阵 a1,a2,a3,a4....an b1,b2,b3,b4....bn 假设矩阵的最大得分取法为 a1*2b1*2a2*4b2*4a3*8b3*8.....an*2^nb2*2^n&#xff1b; 可以转…