如何识别 不同容器在 JSON.stringify 时的自描述性缺失

胖婷小哥_6970

胖婷小哥_6970

2026-05-10

870人浏览

原创

JSON.stringify 会丢失容器类型元信息,所有非原生 JSON 类型(如 Map、Set、Date、RegExp)均被扁平化为 object 或 array,原始语义和行为特征完全丧失。

如何识别 不同容器在 json.stringify 时的自描述性缺失

JSON.stringify 本身不提供容器类型元信息,所有对象、数组、Map、Set、Date、RegExp 等,在序列化后都“扁平”为 JSON 原生结构(object 或 array),原始容器身份完全丢失。识别这种“自描述性缺失”,关键不是看输出字符串长什么样,而是**比对输入与输出的类型语义断层**。

看输出是否保留容器本质特征

原生 JSON 只有 object 和 array 两种复合类型,其他容器必须靠内容或约定“伪装”:

  • Array:能保留 → 输出是 [...],且元素顺序、稀疏性(如 [1,,3])在解析后仍为数组
  • Plain Object:能保留 → 输出是 {...},但无法区分是 {}、Object.create(null) 还是 class 实例(原型和构造器全丢)
  • Map / Set:彻底丢失容器身份 → 直接被忽略(Map 不可枚举键)、或转为空对象 {}、或若手动遍历转成数组则失去 Map/Set 的语义(如键类型不限、重复键覆盖等)
  • Date:类型丢失 → 变成 ISO 字符串 "2026-05-09T06:26:00.000Z",parse 后是 string,不再是 Date 实例
  • RegExp:类型丢失 → 变成空对象 {},原始正则表达式源码、标志(g/i/m)全部消失
  • TypedArray(如 Uint8Array):内容可能保留,但类型丢失 → 默认转为普通数组 [1,2,3],无法还原 buffer、byteOffset、length 等特性

检查 key-value 层级是否发生静默坍缩

某些容器在 stringify 时会因不可枚举性、Symbol 键或 toJSON 行为导致字段“凭空消失”或“意外变形”:

arcgis-js
arcgis-js

提供 ArcGIS Maps SDK for JavaScript 开发辅助,涵盖 2D/3D 地图视图、图层管理、数据可视化、空间分析等功能模块的参考和示例指导。

下载
  • 用 Object.defineProperty(obj, 'hidden', { value: 42, enumerable: false }) 定义的属性 → 不会出现于输出中
  • 以 Symbol('id') 为键的属性 → 被完全忽略(Symbol 键不参与 JSON 序列化)
  • 对象含 toJSON() 方法 → 输出的是该方法返回值,而非对象自身结构(例如 new Date().toJSON() 返回字符串,掩盖了它是 Date 的事实)
  • Map 转成对象再 stringify(如 Object.fromEntries(map))→ 若 key 是对象或 symbol,会变成 "[object Object]" 或直接丢弃,造成数据错位

验证能否无损 round-trip 还原容器

这是最实用的识别方式:把原始容器 stringify 再 parse,看能不能恢复成相同行为的实例:

  • const m = new Map([['a', 1]]); const s = JSON.stringify(m); const p = JSON.parse(s); p instanceof Map → false
  • const d = new Date(); const s = JSON.stringify(d); const p = JSON.parse(s); p instanceof Date → false;typeof p === 'string' → true
  • const r = /abc/g; const s = JSON.stringify({r}); // {"r":{}};parse 后 r 是空对象,不是 RegExp
  • 若你依赖 map.has(key) 或 set.size 等 API → stringify+parse 后这些能力全部失效,说明自描述性已断裂

留意控制台调试时的“假象”误导

浏览器开发者工具常对对象做美化展示(比如把 Map 显示为 Map(1) {"a" => 1}),但这只是 UI 渲染,不代表它能被 JSON.stringify 正确捕获。真正检验方式只有执行 JSON.stringify(yourValue) 并观察返回字符串内容 —— 如果里面没有明确标识容器类型的字段(如 "$type": "Map")、也没有保留其关键行为特征(如 Map 的键值对结构、Set 的唯一性表达),那就确认发生了自描述性缺失。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2195

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3482

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1176

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4019

7

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.31

3171

5

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.31

554

9

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2026.02.12

542

19

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

20

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习