JSON.stringify方法

2024-08-29 16:08
文章标签 方法 json stringify

本文主要是介绍JSON.stringify方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JSON.stringify方法对正则的处理

看Sizzle的时候,用JSON.stringify方法输出了一下RegExp,结果是个空对象{}。一脸茫然。。。。。 一脸懵逼???黑人问号.png

JSON.stringify({r: /abc/});
// '{"r":{}}'
JSON.stringify(/abc/);
// "{}"

那么我们看看RegExp.prototype.toString()方法的输出结果是否是预期的呢?

/abc/.toString(); // "/abc/"  没问题,

Array也是对象,我们都知道JSON.stringify 是会将Array中的元素转成字符串输出的。

JSON.stringify(['a', 'b', 'c']); // '["a","b","c"]'

Array 和 RegExp同是衍生对象,为啥这么不同命呢?

为啥JSON.stringify方法为什么不会在处理RegExp对象时,调用RegExp自身的toString方法呢?

JSON.stringify不支持的数据类型

JSON.stringify会处理的几种类型: String, Number, Boolean, null, Array, Object
不会处理的几种类型: Date, RegExp, undefined, Function

var o = {n: 1,s: 'abc',b: true,empty: null,a: [1,2,3],o:{ a: 1},d: new Date(),r: /abc/,u: undefined,f: function(){}
}console.log(JSON.stringify(o));
// {"n":1,"s":"abc","b":true,"empty":null,"a":[1,2,3],"o":{"a":1},"d":"2018-07-05T02:49:37.194Z","r":{}}

可以看到,支持的类型都被处理了; 不支持的类型中,Date类型被转成了字符串输出,正则表达式转成了空对象, undefined和Function都被直接忽略了。

replacer

先不解释为什么Date属于不支持的类型,但是确能被转成UTC时间的问题。

我们来聊聊 JSON.stringify方法中的第二个可选参数 replacer

如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为null或者未提供,则对象所有的属性都会被序列化;

对于JSON.stringify不支持的数据类型,我们推荐使用replacer来处理。

JSON.stringify({r: /abc/}, function(k, v){if(v instanceof RegExp){return v.toString();}return v;
});
// '{"r":"/abc/"}'
toJSON方法

如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为:不是那个对象被序列化,而是调用 toJSON 方法后的返回值会被序列化。这也是JSON.stringify在处理Date类型时,能够输出字符串的原因————因为Date类型本身被实现了toJSON方法。

RegExp.prototype.toJSON = RegExp.prototype.toString;
JSON.stringify({r: /abc/});
// '{"r":"/abc/"}'
总结

现在我们回到开头说的正则类型转换问题,想要解决的话可以通过replacer和toJSON两种方式实现。

【参考资料】

Using JavaScript’s JSON.stringify

MDN’s JSON.stringify()

这篇关于JSON.stringify方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118331

相关文章

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

java导出pdf文件的详细实现方法

《java导出pdf文件的详细实现方法》:本文主要介绍java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下... 目录使用注意点包含内容1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接使

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2