JSON 序列化的问题
decimal.js 的 Decimal 实例默认在进行 JSON 序列化时,会被转换为对象而非字符串或数字,导致序列化结果不符合预期,影响数据传输和存储。
常见表现
import Decimal from 'decimal.js';
const num = new Decimal('123.456');
console.log(JSON.stringify({ amount: num }));
// 输出: {"amount":{}}
`
这是因为 Decimal 实例没有实现合适的 toJSON() 方法,导致序列化时输出空对象。
解决方案
1. 自定义 toJSON 方法
为 Decimal 原型添加 toJSON 方法,将其转为字符串:
Decimal.prototype.toJSON = function() {
return this.toString();
};
const num = new Decimal('123.456');
console.log(JSON.stringify({ amount: num }));
// 输出: {"amount":"123.456"}
2. 在序列化时手动转换
在调用 JSON.stringify 前,将 Decimal 实例转换为字符串:
const obj = { amount: num.toString() };
console.log(JSON.stringify(obj));
// 输出: {"amount":"123.456"}
3. 使用 replacer 函数
在 JSON.stringify 时,使用 replacer 函数自动转换:
function decimalReplacer(key, value) {
if (value instanceof Decimal) {
return value.toString();
}
return value;
}
console.log(JSON.stringify({ amount: num }, decimalReplacer));
// 输出: {"amount":"123.456"}
反序列化处理
接收端解析时,需要将字符串恢复为 Decimal:
const jsonStr = '{"amount":"123.456"}';
const obj = JSON.parse(jsonStr);
obj.amount = new Decimal(obj.amount);
注意事项
- 保持序列化和反序列化的转换一致,避免类型混乱。
- 选择适合项目的方案,确保数据传输安全和准确。
合理处理 decimal.js 的 JSON 序列化,保证数值数据在前后端传输中的完整性和准确性。
相关内容
- 为什么需要 decimal.js JavaScript 原生数字类型存在浮点精度问题,导致金融、科学计算等场景出现误差。decimal.js 提供高精度的小数计算支持,解决原生数值缺陷,适合复杂...
- JS 浮点数精度问题示例 介绍 JavaScript 原生浮点数的精度问题,展示常见的计算误差示例及其影响,并引出高精度计算库 decimal.js 作为解决方案。
- decimal.js 的优势 介绍 decimal.js 库在高精度计算中的优势,包括任意精度支持、丰富的运算功能、多种舍入模式和易用的 API 设计。
- 安装方式 介绍如何在不同环境下安装和引入 decimal.js,包括 npm、yarn 和浏览器 CDN,助你快速集成高精度计算功能。
- 基本使用示例 通过简单示例介绍 decimal.js 的基本用法,包括创建实例和进行常见的加减乘除运算。
- decimal.js 与原生 Number 的对比 通过示例对比 decimal.js 和 JavaScript 原生 Number 类型在数值精度和计算准确性方面的差异,说明 decimal.js 的优势。