如何解决JSON深拷贝在面对BigInt类型数据时强行抛出无法序列化的惊天大坑

酷晨吖_3720

酷晨吖_3720

2026-06-30

955人浏览

原创

json深拷贝遇bigint报typeerror,解决关键是拦截序列化:用replacer转bigint为字符串,或现代环境用structuredclone原生支持;也可预清洗字段,但需避免污染原型、吞错误等陷阱。

如何解决json深拷贝在面对bigint类型数据时强行抛出无法序列化的惊天大坑

JSON深拷贝遇到 BigInt 就报错,不是“小坑”,而是明确中断执行的 TypeError:Do not know how to serialize a BigInt。它不跳过、不忽略、不静默丢数据,而是直接崩掉整个流程。解决的关键,是不让 BigInt 进入 JSON.stringify 的默认序列化路径。

用 replacer 函数拦截并转成字符串

这是兼容性最好、逻辑最干净的通用解法。replacer 在遍历每个值时做类型判断,只对 BigInt 做处理,其余原样透传:

  • 遇到 typeof value === 'bigint',返回 value.toString(),精度零丢失
  • 嵌套对象、数组、多层结构自动生效,无需递归手写
  • 配合 JSON.parse 可完成一次“伪深拷贝”,结果里 BigInt 变成字符串,但结构完整

示例:
const copy = JSON.parse(JSON.stringify(obj, (k, v) => typeof v === 'bigint' ? v.toString() : v));

改用 structuredClone(现代环境首选)

Node.js 18.13+ 或 Chrome 115+ 起,structuredClone() 已原生支持 BigInt、Map、Set、Date、RegExp、循环引用等——它不是“绕过”问题,而是真正理解并复制这些类型:

  • 一行调用:const copy = structuredClone(obj)
  • 拷贝后 123n 还是 123n,类型不变,语义不损
  • 不污染原型、不需预处理、不改变原始数据结构

注意:Safari 和旧版 Node.js 尚未支持,上线前建议加运行时检测。

Browser Js
Browser Js

轻量级CDP浏览器控制,适用于AI代理。相较于内置浏览器工具,token消耗降低3‑10倍,仅在浏览时使用。

下载

提前清洗再走标准流程

如果你清楚哪些字段固定是 BigInt(比如 Prisma 查询结果里的 id、count、balance),可以先轻量清洗,再用任意深拷贝方法:

  • 遍历对象,对已知 key 名(如 id、userId、total)统一 toString()
  • 或全局扫描所有 bigint 值:if (typeof val === 'bigint') obj[key] = val.toString()
  • 清洗后可放心用 JSON.parse(JSON.stringify())、lodash.cloneDeep 等工具

优点是逻辑外显、调试方便;缺点是需要维护字段约定,不适合结构高度动态的场景。

别踩这些“省事”陷阱

有些做法看似快捷,实则埋雷:

  • 往 BigInt.prototype 加 toJSON:TS 报错、污染全局、可能与其他库冲突
  • try-catch 吞掉错误:错误没了,但数据可能已截断或丢失,后续计算出错更难定位
  • 用 + 或 parseInt 强转:超出 Number.MAX_SAFE_INTEGER 就失真,比如 9007199254740992n → 9007199254740992(表面一样,实际已非精确值)

真正安全的深拷贝,不是让错误消失,而是让 BigInt 从一开始就不触发错误。

相关专题

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

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

2023.08.07

2035

5

json是什么
json是什么

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

2023.08.23

2962

1

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

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

2023.10.13

1016

3

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

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

2025.09.10

3359

7

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

80

15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.6万人学习