查询参数与 JSON 互转

URL 查询字符串和 JSON 对象互相转换

查询字符串与 JSON 互转:重复键和嵌套怎么处理

查询字符串的结构限制

查询字符串的模型是扁平的键值对列表,不是对象。它是这样一串文本:

?a=1&b=2&list=3&list=4&empty=&flag

对应到 JSON 时有几个必须确定的规则:

查询串现象合理处理说明
list=3&list=4合并成数组 {"list":["3","4"]}重复键唯一合理的解释就是多值
empty={"empty":""}键存在,值为空字符串
flag(无等号){"flag":""}有键无值,通常视为空字符串
出现两次但只想取一个取第一个或最后一个没有标准,不同框架行为不同

第四行是必须警惕的:同一个参数出现多次时,取第一个还是最后一个由服务端框架决定。ASP.NET 倾向逗号合并、PHP 倾向后者覆盖前者、Node 的 querystring 与 URLSearchParams 行为也有差异。如果你的接口有重复参数,先确认服务端怎么处理,否则可能被"参数污染"绕过校验——这是安全测试里的经典手法。

嵌套结构:没有统一标准

查询字符串本身不支持嵌套,但各家框架发明了各自的语法,互不兼容:

风格写法典型来源
点号user.name=BobSpring、部分 .NET 绑定
方括号(PHP)user[name]=BobPHP 的 $_GET
方括号带下标list[0]=a&list[1]=bRails、PHP
JSON 字符串filter=%7B%22a%22%3A1%7D需要显式解码,最通用也最啰嗦

所以把嵌套 JSON 转成查询串之前,必须先确认接收方认哪种语法。本工具做的是扁平键值对的转换(重复键合并为数组),嵌套对象需要你先转成点号或方括号形式,或者整体作为 JSON 字符串放进一个参数并做 URL 编码。硬用扁平转换去处理嵌套结构,结果是键名里带着 [ 这种字符、对端完全解析不出层次。

编码与常见错乱

  • 值必须做 URL 编码。值里出现 &、=、#、+、空格时必须转义,否则会被解析成结构字符。& 未转义会把后面的内容切成新参数,这是最常见的错乱来源。
  • + 与 %20。在表单式编码里 + 代表空格,但在普通 URL 里 + 就是加号本身。判断依据是这段查询串来自 HTML 表单提交还是手工拼装的 URL。
  • 重复编码。看到 %2520 就说明编码了两次(% 自身被编成 %25),解码一次能得到 %20,还要再解一次才是空格。
  • 长度限制。查询串有实际长度上限(各浏览器与代理不同,常见的保守值是 2 KB 左右,Chrome 与主流服务器允许更长但不宜依赖)。要传大数据应该用 POST body。

工具怎么用

两个方向:把 a=1&b=2 这样的查询串解析成 JSON 对象(重复键自动合并为数组),或者把扁平的对象拼接成查询串。粘贴时不必带开头的 ?,带上也会被正确忽略。

调试场景里尤其方便:从开发者工具的网络面板复制出请求参数,转成 JSON 后能直接对比两个请求的差异;反过来把参数对象转成查询串再贴进 curl 或浏览器地址栏。

常见问题

重复键会怎样?

例如 a=1&a=2 转 JSON 会得到 {"a":["1","2"]},还原时再展平成多个同名参数,可往返。

特殊字符会被编码吗?

JSON → 查询 会调用 encodeURIComponent 编码中文与符号;反向则用 decodeURIComponent 还原。