深度使用JSON.stringify()
按照 JSON 的规范,使用 JSON.stringify() 做对象序列化时,如果一个属性为函数,那这个属性就会被忽略。
const data1 = { a: 'aaa', fn: function() { return true } } JSON.stringify(data) // 结果是 "{"a":"aaa"}"
还有一种情况,一个属性的值为 undefined
1 const data2 = { 2 a: 'abc', 3 b: undefined 4 } 5 JSON.stringify(data2) 6 7 // 结果是 "{"a":"abc"}"
如果属性为 null
则可以正常序列化这个属性:
1 const data3 = { 2 a: 'abc', 3 b: null 4 } 5 JSON.stringify(data3) 6 7 // 结果是 "{"a":"abc","b":null}"
null
undefined
JSON.stringify
stringify
函数
stringify
函数的定义为 JSON.stringify(value [, replacer [, space]])
后面还带有我不常用两个可选参数 replacer 和 space
value
参数不多解释,replacer
其实就是一个自定义函数,可以改变 JSON.stringify
的行为,space
就是格式化输出,最大值为 10,非整数时取值为 1
stringify
输出 Function
本质上无论怎么改,stringify
还是不会输出 Function
,但是 Function
可以调用 toString()
方法的,所以思路就很明了了。
const data1 = { a: 'aaa', fn: function() { return true } } const replace = function(k ,v) { if(typeof v === 'function') { return Function.prototype.toString.call(v) } return v } JSON.stringify(data1, replace) // 结果 "{"a":"aaa","fn":"function () {\n return true\n }"}"
同理可证 undefined
也能输出了
const replace = function(k ,v) { if(v === undefined){ return 'undefined' } return v }
stringify
格式化输出
JSON.stringify
的第三个参数很简单,相当于我们编辑器的 tab_size
const data4 = { a: 'abc', b: null, c: { x: 'xxx', y: 'yyy', z: 2046 }, d: 9527 } JSON.stringify(data4, null, 2); // 输出结果 /* "{ "a": "abc", "b": null, "c": { "x": "xxx", "y": "yyy", "z": 2046 }, "d": 9527 }" */
toJSON
方法
toJSON
是个覆盖函数,尽量少用,看了代码就懂了:
const data5 = { a: 'abc', b: null, c: { x: 'xxx', y: 'yyy', z: 2046 }, d: 9527, toJSON: function() { return 'WTF' } } JSON.stringify(data5, null, 2); // 结果返回 "WTF"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器