JSON格式数据如何转换为链接格式(URL参数/查询字符串)
在Web开发中,我们经常需要在前后端之间传递数据,JSON(JavaScript Object Notation)因其轻量级、易读的特性,常作为数据交换格式;而链接格式(尤其是URL中的查询字符串)则常用于GET请求中传递参数,将JSON格式转换为链接格式(即URL查询字符串),是前后端交互中的常见需求,本文将详细介绍转换的方法、注意事项及实际应用场景。
什么是JSON格式与链接格式?
JSON格式
JSON是一种基于文本的数据交换格式,采用键值对(Key-Value)的结构,数据类型包括对象({})、数组([])、字符串、数字、布尔值和null等,示例:
{
"name": "张三",
"age": 25,
"hobbies": ["阅读", "游泳"],
"isStudent": true
}
链接格式(URL查询字符串)
链接格式通常指URL中之后的部分,即查询字符串(Query String),由键值对组成,多个参数用&分隔,值需要经过URL编码,示例:
https://example.com/user?name=张三&age=25&hobbies=0&hobbies=1&isStudent=true
hobbies是数组,转换为查询字符串时通常需要重复键名(或使用特定分隔符,如逗号,取决于后端解析规则)。
转换的核心方法
将JSON转换为链接格式的核心步骤是:遍历JSON对象的键值对,对值进行URL编码,然后拼接成key=value的形式,最终用&连接所有键值对,以下是不同场景下的具体实现方法。
简单对象(无嵌套、无数组)
对于最简单的JSON对象(值均为基本类型,如字符串、数字、布尔值),转换逻辑直接:键名不变,值进行URL编码,用连接,多个键值对用&分隔。
示例JSON:
{
"name": "张三",
"age": 25,
"isStudent": true
}
转换步骤:
- 遍历键值对:
name="张三"、age=25、isStudent=true; - 对值进行URL编码:
"张三"→%E5%BC%A0%E4%B8%89(UTF-8编码);25(数字)无需编码(但编码后仍为25);true(布尔值)转为字符串"true"后编码(仍为true)。
- 拼接查询字符串:
name=%E5%BC%A0%E4%B8%89&age=25&isStudent=true。
最终链接:
https://example.com/user?name=%E5%BC%A0%E4%B8%89&age=25&isStudent=true
嵌套对象(JSON中包含对象)
如果JSON中包含嵌套对象(如address是一个对象),需要将嵌套对象的键名与父级键名组合(通常用或_连接),然后按上述规则转换。
示例JSON:
{
"name": "李四",
"address": {
"city": "北京",
"district": "海淀区"
}
}
转换步骤:
- 遍历键值对:
name="李四"、address={"city":"北京","district":"海淀区"}; - 处理嵌套对象:将
address的子键与父键组合,得到address.city="北京"、address.district="海淀区"; - 对值进行URL编码:
"北京"→%E5%8C%97%E4%BA%AC,"海淀区"→%E6%B5%B7%E6%B7%80%E5%8C%BA; - 拼接查询字符串:
name=%E6%9D%8E%E5%9B%BD&address.city=%E5%8C%97%E4%BA%AC&address.district=%E6%B5%B7%E6%B7%80%E5%8C%BA。
最终链接:
https://example.com/user?name=%E6%9D%8E%E5%9B%BD&address.city=%E5%8C%97%E4%BA%AC&address.district=%E6%B5%B7%E6%B7%80%E5%8C%BA
数组类型(JSON中包含数组)
数组是转换中的特殊场景,常见的处理方式有两种:
- 重复键名:数组的每个元素对应一个相同的键名,用
&连接(适用于后端支持重复参数解析,如PHP的$_GET); - 特定分隔符:将数组元素用逗号()、分号()等分隔符拼接成一个字符串,再进行URL编码(需与后端约定分隔符)。
示例JSON(数组):
{
"name": "王五",
"hobbies": ["阅读", "游泳", "编程"]
}
重复键名
转换步骤:
- 遍历数组:
hobbies[0]="阅读"、hobbies[1]="游泳"、hobbies[2]="编程"; - 对值编码:
"阅读"→%E9%98%85%E8%AF%BB,"游泳"→%E6%B8%B8%E6%B3%B3,"编程"→%E7%BC%96%E7%A8%8B; - 拼接查询字符串:
name=%E7%8E%8B%E4%BA%94&hobbies=0&hobbies=1&hobbies=2(注意:数组索引从0开始,但通常直接存值,即hobbies=%E9%98%85%E8%AF%BB&hobbies=%E6%B8%B8%E6%B3%B3&hobbies=%E7%BC%96%E7%A8%8B)。
逗号分隔符
转换步骤:
- 将数组元素用逗号拼接:
hobbies="阅读,游泳,编程"; - 对拼接后的字符串编码:
"阅读,游泳,编程"→%E9%98%85%E8%AF%BB%2C%E6%B8%B8%E6%B3%B3%2C%E7%BC%96%E7%A8%8B(%2C是的URL编码); - 拼接查询字符串:
name=%E7%8E%8B%E4%BA%94&hobbies=%E9%98%85%E8%AF%BB%2C%E6%B8%B8%E6%B3%B3%2C%E7%BC%96%E7%A8%8B。
最终链接(以方式一为例):
https://example.com/user?name=%E7%8E%8B%E4%BA%94&hobbies=%E9%98%85%E8%AF%BB&hobbies=%E6%B8%B8%E6%B3%B3&hobbies=%E7%BC%96%E7%A8%8B
复杂JSON(嵌套对象+数组)
对于同时包含嵌套对象和数组的复杂JSON,需结合上述方法:先处理嵌套对象(组合键名),再处理数组(选择重复键名或分隔符)。
示例JSON:
{
"name": "赵六",
"info": {
"age": 30,
"tags": ["前端", "开发"]
}
}
转换步骤:
- 处理顶层键值对:
name="赵六"、info={"age":30,"tags":["前端","开发"]}; - 处理嵌套对象
info:- 基本类型:
info.age=30; - 数组
tags:采用重复键名,得到info.tags[0]="前端"、info.tags[1]="开发";
- 基本类型:
- 对值编码:
"赵六"→%E8%B5%B5%E5%85%AD,"前端"→%E5%89%8D%E7%AB%AF,"开发"→%E5%BC%80%E5%8F%91; - 拼接



还没有评论,来说两句吧...