URL参数中的换行符%0A引发JSON.parse解析失败,该如何解决?
解决URL参数中换行符导致JSON.parse失败的问题
你的问题核心在于手动拼接JSON字符串时未转义换行符——JSON规范不允许字符串中存在未转义的换行符,而URL里的%0A解码后就是原生换行符\n,直接留在JSON字符串里会触发解析报错。下面给你两种解决方案,优先推荐第一种更健壮的实现:
方案1:使用原生URLSearchParams API(推荐)
浏览器原生提供了URLSearchParams来处理URL查询参数,它会自动完成所有URL编码字符的解码(包括换行符、空格、特殊符号等),完全不需要手动拼接JSON,代码简洁且可靠:
// 直接从当前URL提取查询参数 const urlParams = new URLSearchParams(window.location.search); // 映射为你需要的对象结构 const _data = { cn: urlParams.get('cn'), pn: urlParams.get('pn'), pe: urlParams.get('pe'), d: urlParams.get('d'), // 这里会自动把%0A解码成换行符,直接得到完整的多行文本 ye: urlParams.get('ye'), c: urlParams.get('c'), tc: urlParams.get('tc') === 'true' // 手动转换布尔值,因为URL参数默认都是字符串类型 };
这个方法的优势是:原生API会处理所有边缘情况(比如%0D回车符、%09制表符等),避免了手动字符串替换可能遗漏的特殊字符,代码可读性和维护性也更高。
方案2:修复手动拼接JSON的逻辑
如果你一定要保留原有的字符串拼接方式,需要在生成JSON字符串前,把换行符转义为JSON允许的\\n格式:
var _url = window.location.href; var _queryParams = decodeURIComponent(_url.split('?')[1]); var _search = _queryParams; // 新增换行符、回车符的转义步骤 var processedSearch = decodeURI(_search) .replace(/"/g, '\\"') .replace(/\n/g, '\\n') // 将换行符转义为JSON可识别的格式 .replace(/\r/g, '\\r') // 顺便处理回车符,避免潜在报错 .replace(/&/g, '","') .replace(/=/g, '":"'); var _data = JSON.parse('{"' + processedSearch + '"}');
不过要注意,这种方式仍存在风险——如果参数中包含其他特殊字符(比如反斜杠\、单引号'等),还是可能触发JSON解析错误,所以优先推荐方案1。
内容的提问来源于stack exchange,提问作者tonejac
相关产品推荐
相关产品推荐

