JSON 格式化 / 压缩 / 校验JSON 转义 / 去转义JSON 对比JSON 键排序JSON 转字符串 / 字符串转 JSONJSON 转 XMLXML 转 JSONJSON 数组转 CSVCSV 转 JSON 数组JSON 与 YAML 互转JSON 生成代码定义查询参数与 JSON 互转Cookie 与 JSON 互转JSON 与 Properties 互转
查询参数与 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=Bob | Spring、部分 .NET 绑定 |
| 方括号(PHP) | user[name]=Bob | PHP 的 $_GET |
| 方括号带下标 | list[0]=a&list[1]=b | Rails、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 还原。