JavaScript中JSON.stringify丢失末尾零的解决办法及替代库咨询
解决JSON.stringify保留数值末尾零的问题
JSON 本身不区分整数和浮点数,而 JavaScript 的 JSON.stringify 会将 6.0 这类值序列化为 6——因为在 JS 中 6 和 6.0 是同一个 Number 类型值。要实现输出带末尾零的数值格式,可以用以下两种方案:
一、自定义序列化逻辑(无需第三方库)
1. 针对特定字段的正则替换
如果明确知道哪些字段需要保留末尾零,可以先序列化再用正则修改结果:
const data = { x: 5, y: 6.0 }; let jsonStr = JSON.stringify(data); // 替换y字段的整数为带.0的数值格式 jsonStr = jsonStr.replace(/"y":(\d+)/, '"y":$1.0'); console.log(jsonStr); // 输出:{"x":5,"y":6.0}
2. 用标记对象区分数值类型
如果需要通用处理,可以给需要保留末尾零的数值添加标记,再通过 replacer 函数处理:
// 用包装对象标记需要保留小数位的数值 const data = { x: 5, y: { __isFloat: true, value: 6.0 } }; function floatReplacer(key, value) { if (value?.__isFloat) { return `${value.value}.0`; } return value; } let jsonStr = JSON.stringify(data, floatReplacer); // 把字符串形式的"6.0"转为数值格式 jsonStr = jsonStr.replace(/"(\d+\.0)"/g, '$1'); console.log(jsonStr); // 输出:{"x":5,"y":6.0}
二、使用第三方库
部分 JSON 处理库支持自定义数值序列化规则,比如结合 decimal.js 来精确控制输出格式:
const Decimal = require('decimal.js'); const data = { x: new Decimal(5), y: new Decimal('6.0') }; // 先序列化为带字符串格式的数值 let jsonStr = JSON.stringify(data, (key, value) => { return value instanceof Decimal ? value.toString() : value; }); // 去掉引号转为数值格式 jsonStr = jsonStr.replace(/"(\d+\.0)"/g, '$1'); console.log(jsonStr); // 输出:{"x":5,"y":6.0}
需要注意的是:即使输出了 6.0 格式的数值,用 JSON.parse 解析时仍会转回整数 6,这种处理仅适用于需要特定字符串格式的场景。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

