当前位置: 首页 > news >正文

JSON.stringify()可以转换哪些类型?

JSON.stringify()可以将一个 JS 对象或值转成 JSON 字符串。如果指定了 relpacer 函数可以选择性替换值;若 replacer 是个数组,可以选择性地仅转换包含数组指定的属性。

另外 JSON.stringify() 可以和 JSON.parse()配合来实现深拷贝,但不能拷贝值为 undefined 和循环引用的属性。

JSON.stringify() 可以将 JavaScript 值转换为符合 JSON 格式的字符串,但并非所有类型都能被直接转换。以下是支持的类型及其转换规则:


一、支持转换的类型

类型转换结果示例
基本类型
string字符串(双引号包裹)"hello""hello"
number数值(包括整数、浮点数)42423.143.14
booleantruefalsetruetrue
nullnullnullnull
对象类型
Object键值对(属性名用双引号包裹,值递归转换){a: 1}{"a":1}
Array数组(元素递归转换)[1, "2"][1,"2"]
Date调用 toISOString()转换为 ISO 日期字符串new Date()"2023-10-01T00:00:00.000Z"
特殊处理
实现 toJSON() 的对象优先调用 toJSON(),返回结果再递归处理自定义对象中定义 toJSON()
方法

二、无法转换或部分转换的类型

类型转换结果/行为示例
undefined作为属性值时被忽略,单独转换返回 undefined{a: undefined}{}
Function忽略(属性值)或返回 undefined(单独转换)function(){}undefined
Symbol忽略(属性值)或返回 undefined(单独转换)Symbol('foo')undefined
NaN/Infinity转换为 nullNaNnullInfinitynull
特殊对象
Map/Set/WeakMap转换为空对象 {}(因没有可枚举的自有属性)new Map([[1, 2]]){}
RegExp转换为空对象 {}/abc/g{}
Promise转换为空对象 {}Promise.resolve(){}
循环引用抛出 TypeError: Converting circular structure to JSON错误const obj = {}; obj.self= obj;→ 报错

三、转换规则示例

1. 基本类型
JSON.stringify("hello");       // '"hello"'
JSON.stringify(42);            // '42'
JSON.stringify(true);          // 'true'
JSON.stringify(null);          // 'null'
2. 对象与数组
JSON.stringify({ a: 1, b: "2" });  // '{"a":1,"b":"2"}'
JSON.stringify([1, "2", null]);    // '[1,"2",null]'
3. 特殊类型处理
// Date 对象
JSON.stringify(new Date());    // '"2023-10-01T00:00:00.000Z"'

// undefined 和函数
JSON.stringify({ a: undefined, b: function(){}, s: Symbol('s'),[Symbol('d')]: 's',f: ()=>1 });  // '{}'

// NaN/Infinity
JSON.stringify([NaN, Infinity]);  // '[null,null]'

// Symbol
JSON.stringify(Symbol('key'));    // undefined
4. **自定义 ****toJSON()**
const obj = {
  name: "John",
  toJSON() {
    return { name: this.name.toUpperCase() };
  }
};
JSON.stringify(obj);  // '{"name":"JOHN"}'

四、控制转换行为

1. **replacer**** **参数(函数或数组)

过滤或修改序列化结果:

// 过滤属性
JSON.stringify({a: 1, b: 2}, ['a']);  // '{"a":1}'
// 自定义转换
JSON.stringify({a: 1, b: 2}, (key, value) => {
  return key === 'a' ? undefined : value;
});  // '{"b":2}'
2. **space**** **参数(美化输出)

添加缩进或前缀:

JSON.stringify({a: 1}, null, 2);
/*
{
  "a": 1
}
*/

五、总结

  • 可安全转换:基本类型、普通对象、数组、日期(通过 toISOString)、实现 toJSON() 的对象。
  • 被忽略或转换异常undefined、函数、Symbol、特殊对象(如 Map)、循环引用。
  • 使用建议:处理复杂对象时,可结合 replacer 函数或自定义 toJSON() 方法控制输出。

相关文章:

  • 【AI 大模型】RAG 检索增强生成 ⑤ ( 向量数据库 | 向量数据库 索引结构和搜索算法 | 常见 向量数据库 对比 | 安装并使用 向量数据库 chromadb 案例 )
  • LeetCode算法题(Go语言实现)_02
  • Hive SQL 精进系列:REGEXP_COUNT 函数的用法
  • 处理流程设计、系统设计、人机界面设计(高软48)
  • 2024年消费者权益数据分析
  • Vue3.5 企业级管理系统实战(九):菜单组件
  • 【MySQL】从零开始:掌握MySQL数据库的核心概念
  • 服务器发送事件(Server-Sent Events,SSE)详解
  • 【算法学习之路】11.并查集
  • 剑指 Offer II 107. 矩阵中的距离
  • 专线、云 和 物联网(IoT)
  • 【css酷炫效果】纯CSS实现进度条加载动画
  • LightRAG简要概述
  • cmake --build . --config Release和make是1个意思吗
  • SQLMesh系列教程:利用date_spine宏构建日期序列实践指南
  • 网络工程安全从入门到“入魂“教学案
  • CellOracle|基因扰动研究基因功能|基因调控网络+虚拟干预
  • 使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)
  • 黑客攻击deepseek服务原理解析
  • 基于SpringBoot的“酒店管理系统”的设计与实现(源码+数据库+文档+PPT)
  • 光明网评“泉州梦嘉商贸楼不到5年便成危楼”:监管是否尽职尽责?
  • 解放日报:这是一场需要定力和实力的“科技长征”
  • 厚重与潮流交织,淮安展现“运河之都”全新城市想象
  • 人社部:一季度全国城镇新增就业308万人,同比增加5万人
  • 铁路五一假期运输今日启动,预计发送旅客1.44亿人次
  • 普京发表声明感谢协助俄军收复库尔斯克州的朝鲜军人