构造含特殊字符变量的URL致JSON无效,如何有效转义特殊字符?
解决URL中JSON参数的特殊字符转义问题
嘿,我完全懂你踩的这个坑——手动拼接带特殊字符的URL参数简直是噩梦,尤其是当这些字符同时属于URL和JSON的特殊字符时。让我一步步帮你捋清楚解决办法:
问题根源
你现在的写法是直接把变量硬塞进JSON字符串,再拼进URL里。比如title_text里的&会被URL编码成%26,但真正的麻烦是:&本身是URL的参数分隔符,浏览器会把%26后面的内容当成新的URL参数,直接把data参数里的JSON给截断了,结构自然就无效了。而且你只单独对title_text用JSON.stringify,既没处理整个JSON对象,也没对最终的JSON字符串做URL编码,所以才没解决问题。
正确的处理流程
正确的姿势应该是分四步走,把JSON构造和URL编码彻底分开:
- 先构造完整的JavaScript对象,把变量合理放进去
- 把整个对象转成合法的JSON字符串
- 对这个JSON字符串做URL编码,确保所有URL特殊字符都被转义
- 最后再拼进URL里
这样就能同时搞定JSON的特殊字符和URL的特殊字符,不会互相干扰。
代码示例
// 1. 先构造包含查询内容的对象 const queryData = { query: `${title_text} ${city_name}` }; // 2. 把对象转成标准的JSON字符串 const jsonStr = JSON.stringify(queryData); // 3. 对整个JSON字符串做URL编码 const encodedJson = encodeURIComponent(jsonStr); // 4. 拼接成最终的合法URL const URL = `https://bla.com/api/multicomplete?data=${encodedJson}`;
为什么这样有效?
JSON.stringify会自动处理JSON里的特殊字符(比如引号、反斜杠),生成格式完全合法的JSON文本。encodeURIComponent会把整个JSON字符串里的URL特殊字符(&、=、%等)转成URL安全的编码,浏览器就不会把它们当成URL的参数分隔符,而是完整地作为data参数的一部分传递给后端。
拿你之前的例子来说,title_text = 'Airport Hotel Park & Fly Sofia'用这个方法处理后:
- 生成的JSON字符串是
{"query":"Airport Hotel Park & Fly Sofia"} - 经过编码后会变成
%7B%22query%22%3A%22Airport%20Hotel%20Park%20%26%20Fly%20Sofia%22%7D - 后端拿到
data参数后,解码就能得到完整合法的JSON,不会再出现结构错误。
为什么之前的JSON.stringify没用?
因为你只单独转义了title_text,但没处理整个JSON对象,更关键的是没有对最终的JSON字符串做URL编码。单独转义title_text后拼进URL,&还是会被浏览器识别成参数分隔符,直接把JSON给拆坏了。
内容的提问来源于stack exchange,提问作者Vlada




