如何用JavaScript将JSON中的数字序列化为十六进制格式?
如何用JSON.stringify将数字序列化为十六进制格式?
首先得明确一点:JSON的官方规范里,数字只能以十进制形式表示,所以JSON.stringify默认确实只会输出十进制数字,没法直接生成0x400这种十六进制的数字语法——因为这根本不是合法的JSON格式。
不过根据你的需求,我们可以分两种场景来解决:
场景1:输出字符串形式的十六进制(符合JSON规范)
如果可以接受把数字转成"0x400"这样的字符串值,那用JSON.stringify的第二个参数replacer函数就能轻松实现,这也是最安全、符合规范的做法:
const targetObj = { number: 1024 }; const hexJson = JSON.stringify(targetObj, (key, value) => { // 判断当前值是否为数字类型,是的话转成十六进制字符串 if (typeof value === 'number') { return `0x${value.toString(16)}`; } // 非数字类型保持原样 return value; }); console.log(hexJson); // 输出:{"number":"0x400"}
这种方式生成的是标准JSON,后续用JSON.parse解析后,number字段会是字符串类型,如果你需要转回数字,可以在解析时处理,比如:
const parsedObj = JSON.parse(hexJson, (key, value) => { if (typeof value === 'string' && value.startsWith('0x')) { return parseInt(value, 16); } return value; });
场景2:输出非标准的十六进制数字格式(不推荐)
如果你一定要生成{ "number": 0x400 }这种格式(注意这已经不是合法JSON了),那只能在JSON.stringify之后手动用正则替换数字:
const targetObj = { number: 1024, text: "包含数字123的字符串", nested: { num: 255 } }; let rawJson = JSON.stringify(targetObj); // 正则匹配JSON中的数字值(避开字符串里的数字) rawJson = rawJson.replace(/"?(\d+)"?(?=([^"]*"[^"]*")*[^"]*$)/g, (match) => { const num = parseInt(match, 10); return `0x${num.toString(16)}`; }); console.log(rawJson); // 输出:{"number":0x400,"text":"包含数字123的字符串","nested":{"num":0xff}}
⚠️ 注意:这种方法有明显局限性:
- 生成的字符串不是合法JSON,
JSON.parse无法直接解析,必须自己写自定义解析逻辑 - 正则表达式可能无法处理所有复杂情况(比如小数、科学计数法的数字),容易出错
所以除非你有特殊的非标准需求,否则优先选择场景1的方案。
内容的提问来源于stack exchange,提问作者Alko
相关产品推荐
相关产品推荐

