如何将URL编码转换为JSON?JS解码报URI Malformed错误解决
问题说明
- 待处理的URL编码位置数据:
%7B%22distance%22%3A1000000%2C%22country%22%3A%22BR%22%2C%22city%22%3A%22S%E3o%20Paulo%22%2C% 22latitude%22%3A-23.6283%2C%22longitude%22%3A-46.6409%2C%22region_code%22%3A%22SP%22%7D - 目标:将上述编码内容转换为标准JSON
- 故障表现:调用JavaScript解码函数时抛出
URI Malformed(URI格式畸形)错误,无法完成转换,报错截图如下:
故障根因
编码字符串存在两处不符合URL编码规范的问题,直接触发解码报错:
- 编码串中
% 22片段的百分号和十六进制字符之间插入了多余半角空格,标准URL编码要求%后必须直接紧跟两位十六进制转义字符,空格会打断转义序列结构 - 城市名
São Paulo中的字符ã使用了残缺编码:UTF-8编码下ã对应的正确URL编码为%C3%A3,原编码仅写了单字节%E3,属于不完整的多字节字符转义序列
修复步骤
预处理原始编码串:移除所有打断转义序列的非法空格,补全残缺的字符编码,修复后的合法编码串如下:
%7B%22distance%22%3A1000000%2C%22country%22%3A%22BR%22%2C%22city%22%3A%22S%C3%A3o%20Paulo%22%2C%22latitude%22%3A-23.6283%2C%22longitude%22%3A-46.6409%2C%22region_code%22%3A%22SP%22%7D执行解码与JSON解析,参考JavaScript代码:
// 修复后的编码字符串 const encodedLocation = "%7B%22distance%22%3A1000000%2C%22country%22%3A%22BR%22%2C%22city%22%3A%22S%C3%A3o%20Paulo%22%2C%22latitude%22%3A-23.6283%2C%22longitude%22%3A-46.6409%2C%22region_code%22%3A%22SP%22%7D"; // 解码+转JSON const locationData = JSON.parse(decodeURIComponent(encodedLocation)); console.log(locationData);
- 最终解析得到的标准JSON结果:
{ "distance": 1000000, "country": "BR", "city": "São Paulo", "latitude": -23.6283, "longitude": -46.6409, "region_code": "SP" }
排查提示:后续遇到同类
URI Malformed报错,优先检查两个方向:一是编码串中是否存在空格、特殊符号打断%开头的转义序列;二是是否存在残缺的多字节字符编码。
内容的提问来源于stack exchange,提问作者Jorge Barros
相关产品推荐
相关产品推荐

