JSON.parse禁用类型验证及保留数值原始格式的实现方法
解决JSON.parse保留数字格式及禁用类型验证的问题
一、如何保留值的原始格式?
首先得明确:JSON的数字类型本身不存储格式信息——100、100.0、100.000在JSON规范里是完全等价的数值,所以JSON.parse解析后都会变成JavaScript的Number类型值100,丢失了原始的小数位数。要保留格式,有两种可行方案:
方案1:修改原始JSON字符串(推荐,最可靠)
把需要保留格式的数字改成字符串类型,给数值加上引号:
const jsonStr = '{"a":"100.000"}'; const obj = JSON.parse(jsonStr); console.log(obj); // { a: "100.000" }
这样解析后a的类型是字符串,完全保留了原始的格式。
方案2:使用JSON.parse的reviver函数(适合无法修改原始JSON的场景)
如果不能修改原始JSON,可以通过第二个参数reviver函数,在解析时将数字转换为指定格式的字符串:
const jsonStr = '{"a":100.000}'; const obj = JSON.parse(jsonStr, (key, value) => { // 判断当前值是数字时,转换为保留三位小数的字符串 if (typeof value === 'number') { return value.toFixed(3); } return value; }); console.log(obj); // { a: "100.000" }
⚠️ 注意:这个方法的局限性是——如果原始JSON里的数字是100.1234,toFixed(3)会截断为100.123,无法严格还原原始的小数位数(因为JSON.parse已经把原始数值解析成了100.1234,丢失了原始格式的元信息)。
二、如何在JSON.parse时禁用类型验证?
JSON.parse本身是严格遵循JSON规范的,没有官方的“禁用类型验证”选项,但如果你的需求是允许不符合JSON规范的语法(比如单引号、无引号的键名、 trailing commas等),可以使用第三方库来实现宽松解析:
比如使用json5库(它支持更人性化的JSON语法):
// 先安装json5:npm install json5 const JSON5 = require('json5'); // 解析单引号包裹的JSON const obj1 = JSON5.parse("{'a':100.000}"); // 解析无引号键名的JSON const obj2 = JSON5.parse("{a:100.000}"); console.log(obj1, obj2); // 都能成功解析为 { a: 100 }
如果不想依赖第三方库,你需要自己实现一个宽松的解析器,但这会涉及到复杂的语法处理,不推荐——直接用成熟的库更稳妥。
内容的提问来源于stack exchange,提问作者Santosh Hegde
相关产品推荐
相关产品推荐

