JSON数组怎么传值:从基础到实践的完整指南
在Web开发中,数据传输是连接前后端的核心环节,而JSON(JavaScript Object Notation)以其轻量级、易读、易解析的特性,成为了前后端数据交换的“通用语言”,JSON数组作为一种常用的数据结构,承载着列表型数据(如商品列表、用户信息、任务队列等)的传输任务,本文将从“什么是JSON数组”出发,详细拆解JSON数组传值的完整流程,包括前后端的具体实现、常见问题及解决方案,帮你彻底这一核心技能。
先搞懂:什么是JSON数组?
要传值,得先知道“传的是什么”,JSON数组是JSON中的一种数据结构,本质上是值的有序集合,这些值可以是字符串、数字、布尔值、对象,甚至是嵌套的数组或JSON,它的语法规则非常明确:
- 用方括号
[]包裹整体; - 数组内元素用逗号 分隔;
- 元素类型可以是:
- 基本类型:
"string"、123、true、null; - 复合类型:(JSON对象)、
[](嵌套数组)。
- 基本类型:
示例:常见的JSON数组
// 纯字符串数组
["苹果", "香蕉", "橙子"]
// 纯数字数组
[1, 2, 3, 4, 5]
// 混合类型数组(不推荐,实际开发中建议保持类型一致)
["苹果", 5, true, null]
// 对象数组(最常用,如列表型数据)
[
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 30},
{"id": 3, "name": "王五", "age": 28}
]
// 嵌套数组(如二维数据)
[
[1, "数学", 90],
[2, "语文", 85],
[3, "英语", 92]
]
传值前:准备好JSON数组数据
无论是前端向后端传,还是后端向前端传,第一步都是确保数据是“符合规范的JSON数组”,这里的关键是:将编程语言中的原生数组/列表转换为JSON格式的字符串。
前端:将JS数组转为JSON字符串
前端JavaScript中,原生数组(Array)可以直接通过 JSON.stringify() 方法转换为JSON字符串,这是前后端交互前最常见的一步。
// 1. 定义一个JS数组(对象数组,最常用)
const userList = [
{ id: 1, name: "张三", age: 25 },
{ id: 2, name: "李四", age: 30 },
{ id: 3, name: "王五", age: 28 }
];
// 2. 转为JSON字符串(用于传输)
const jsonString = JSON.stringify(userList);
console.log(jsonString);
// 输出:"[{"id":1,"name":"张三","age":25},{"id":2,"name":"李四","age":30},{"id":3,"name":"王五","age":28}]"
// 3. 如果是简单数组,同样适用
const numbers = [1, 2, 3, 4, 5];
const numbersJson = JSON.stringify(numbers);
console.log(numbersJson); // 输出:"[1,2,3,4,5]"
后端:将数组/列表转为JSON字符串
后端语言(如Java、Python、Node.js等)都有成熟的JSON处理库,核心逻辑同样是“将数组/列表序列化为JSON字符串”。
▍Java(以Spring Boot为例)
import com.fasterxml.jackson.databind.ObjectMapper;
// 1. 定义一个List对象
List<User> userList = Arrays.asList(
new User(1, "张三", 25),
new User(2, "李四", 30),
new User(3, "王五", 28)
);
// 2. 使用Jackson转为JSON字符串
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(userList);
System.out.println(jsonString);
// 输出:[{"id":1,"name":"张三","age":25},{"id":2,"name":"李四","age":30},{"id":3,"name":"王五","age":28}]
▍Python(以Django/Flask为例)
import json
# 1. 定义一个Python列表(对象列表)
user_list = [
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 30},
{"id": 3, "name": "王五", "age": 28}
]
# 2. 使用json模块转为JSON字符串
json_string = json.dumps(user_list)
print(json_string)
# 输出:[{"id": 1, "name": "张三", "age": 25}, {"id": 2, "name": "李四", "age": 30}, {"id": 3, "name": "王五", "age": 28}]
核心场景:JSON数组传值的3种方式
数据准备好后,就需要通过HTTP请求传输,根据业务场景,JSON数组传值主要有3种方式:GET请求(URL参数)、POST请求(请求体)、WebSocket(实时传输)。
方式1:GET请求——通过URL参数传值(适合少量数据)
GET请求的参数会拼接到URL中,因此JSON数组需要先“编码”为URL安全的格式,通常用 encodeURIComponent() 处理。
▍前端:发送GET请求传JSON数组
const dataArray = [1, 2, 3, 4, 5];
// 1. 将数组转为JSON字符串,再URL编码
const encodedData = encodeURIComponent(JSON.stringify(dataArray));
// 2. 拼接到URL参数中
const url = `https://api.example.com/getData?array=${encodedData}`;
// 3. 发送GET请求(使用fetch API)
fetch(url)
.then(response => response.json())
.then(data => console.log("后端返回:", data))
.catch(error => console.error("请求失败:", error));
▍后端:接收GET请求的JSON数组参数
以Java Spring Boot为例,通过 @RequestParam 注解获取参数,再手动解析:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.databind.ObjectMapper;
@RestController
public class DataController {
@GetMapping("/getData")
public String getArrayData(@RequestParam("array") String arrayParam) {
try {
// 1. URL解码(前端用encodeURIComponent编码,后端需解码)
String decodedParam = java.net.URLDecoder.decode(arrayParam, "UTF-8");
// 2. 将JSON字符串解析为Java数组/列表
ObjectMapper objectMapper = new ObjectMapper();
int[] dataArray = objectMapper.readValue(decodedParam, int[].class);
// 3. 处理数据(示例:打印)
System.out.println("接收到的数组:" + Arrays.toString(dataArray));
return "success: " + Arrays.toString(dataArray);
} catch (Exception e) {
return "error: " + e.getMessage();
}
}
}
注意:GET请求的URL长度有限制(通常2048字节),因此JSON数组数据量不宜过大。
方式2:POST请求——通过请求体传值(推荐,适合大量数据)
POST请求的数据放在请求体(Body)中,可以传输更大的数据量,且更安全(不会出现在URL或服务器日志中),这是前后端交互中最常用的方式。
▍前端:发送POST请求传JSON数组(请求体)
const dataArray = [
{ id: 1, name: "商品A", price: 100 },
{ id: 2, name: "商品B", price: 200 },
{ id: 3, name: "商品C", price: 300 }
];
// 1. 直接使用JSON.stringify转为字符串(fetch会自动设置Content-Type)
const requestBody = JSON.stringify(dataArray);
// 2. 发送POST请求(fetch默认Content-Type为application/json)
fetch("https://api.example.com/saveData", {
method: "POST",
headers: {
"Content-Type": "application/json" // 明确告诉后端,请求体是JSON格式
},
body: requestBody
})
.then(response => response.json())
.then(data => console.log("后端返回:", data))
.catch(error => console.error("请求失败:", error));
▍后端:接收POST请求的JSON数组(请求体)
后端通过 @RequestBody 注解直接接收请求体的JSON数据,并自动转换为对应的Java对象/列表(需开启



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