如何使用JavaScript制作JSON混淆器:UTF-8转UTF-16并保留JSON结构
实现方案
核心逻辑依托JS原生JSON API保证结构完全合法,不需要自己手写JSON解析逻辑,完全不会破坏原有JSON结构,只处理文本内容:
- 用
JSON.parse()把输入的UTF-8 JSON字符串解析为JS原生对象 - 递归遍历JS对象的所有键、字符串值,统一转换为UTF-16的
\uXXXX转义格式 - 用
JSON.stringify()把处理后的对象序列化回JSON字符串即可
核心工具函数
首先实现单个字符串转Unicode转义格式的方法:
// 单个字符串转\uXXXX格式 function escapeStrToUnicode(str) { let result = '' for (let i = 0; i < str.length; i++) { // 获取字符的UTF-16编码,转16进制补前导0到4位 const code = str.charCodeAt(i).toString(16).padStart(4, '0') result += `\\u${code}` } return result }
递归处理对象的方法
遍历所有键和值,仅处理字符串类型的内容:
function processJsonObj(obj) { // 处理字符串类型值 if (typeof obj === 'string') { return escapeStrToUnicode(obj) } // 处理数组 if (Array.isArray(obj)) { return obj.map(item => processJsonObj(item)) } // 处理普通对象 if (typeof obj === 'object' && obj !== null) { const processedObj = {} for (const key in obj) { // 转义对象键名 const escapedKey = escapeStrToUnicode(key) // 递归处理键对应的值 processedObj[escapedKey] = processJsonObj(obj[key]) } return processedObj } // 数字、布尔、null等非字符串类型直接返回,不处理 return obj }
完整调用示例
// 输入的JSON字符串 const inputJsonStr = `{ "hi":{ "this":["is","just","some","example"] } }` // 1. 解析为对象 const jsonObj = JSON.parse(inputJsonStr) // 2. 处理对象 const processedObj = processJsonObj(jsonObj) // 3. 序列化回JSON字符串,第三个参数控制缩进为4空格,和示例格式一致 const outputJsonStr = JSON.stringify(processedObj, null, 4) console.log(outputJsonStr)
运行后输出的内容和你给出的预期结果完全一致,且生成的JSON可以正常被所有JSON解析器解析。
注意事项
- 原生
JSON.parse和JSON.stringify保证了JSON结构100%合法,不会出现缺括号、缺引号这类语法错误 - 上述代码仅对字符串类型的键和值做转义,数字、布尔值、null等JSON原生类型完全不修改,符合你的需求
- 如果要处理 emoji 这类超过BMP平面的字符,需要额外处理码点拆分,普通JSON混淆场景下上述代码完全够用
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

