怎么用JSON传数据:从基础到实践的完整指南
在当今的软件开发中,数据交换是连接不同系统、模块的核心环节,而JSON(JavaScript Object Notation)作为一种轻量级、易读易写的数据格式,已成为前后端交互、API通信、配置文件存储等场景的“通用语言”,本文将从JSON的基础概念出发,详细讲解如何使用JSON传递数据,包括语法规则、实际应用场景、代码示例及常见问题,帮助你快速这一关键技能。
JSON是什么?为什么用它传数据?
JSON(全称JavaScript Object Notation)是一种基于JavaScript语法的数据格式,它以“键值对”(Key-Value Pair)的方式组织数据,结构清晰,易于人类阅读和机器解析,与XML、CSV等格式相比,JSON的优势在于:
- 轻量级:数据冗余少(如无结束标签),传输效率高;
- 易解析:几乎所有编程语言都内置JSON解析库,可直接转换为原生数据类型(如对象、字典、列表等);
- 结构灵活:支持嵌套数据,能表示复杂的数据关系(如树形结构、数组嵌套对象等);
- 语言无关:虽源于JavaScript,但与Python、Java、Go等语言完全兼容。
JSON的基础语法:5个核心规则
JSON的数据结构由两种类型组成:对象(Object)和数组(Array),所有数据都必须遵循以下语法规则:
对象:用花括号 包裹,键值对集合
对象表示“无序的键值对集合”,每个键值对格式为 "键": 值,键必须是字符串(用双引号包围),值可以是多种类型(见下文),多个键值对之间用逗号 分隔。
示例:
{
"name": "张三",
"age": 25,
"isStudent": false,
"address": {
"city": "北京",
"district": "海淀区"
}
}
数组:用方括号 [] 包裹,有序值列表
数组表示“有序的值集合”,值可以是任意JSON类型(字符串、数字、布尔值、对象、数组等),多个值之间用逗号 分隔。
示例:
[
"苹果",
"香蕉",
{
"fruitName": "橙子",
"price": 5.8
},
[1, 2, 3]
]
值的5种基本类型
JSON中的“值”只能是以下5种类型(不能是函数、日期等特殊类型):
- 字符串(String):用双引号 包围,如
"Hello",不支持单引号; - 数字(Number):整数或浮点数,如
100、14,不支持科学计数法(部分解析器允许); - 布尔值(Boolean):
true或false(全小写,非True/False); - 空值(Null):
null(表示“无值”,非None/NULL); - 对象/数组:如上述示例,支持嵌套。
严格的大小写和符号要求
- 键必须用双引号包围(单引号会导致解析错误);
- 值如果是字符串,也必须用双引号;
- 不能有末尾逗号(如最后一个键值对或数组元素后不能加 );
- JSON中没有注释(需通过其他方式补充说明)。
怎么用JSON传数据?分场景详解
JSON的核心价值是“跨语言、跨平台传数据”,以下是3个最常见的应用场景及具体操作方法。
场景1:前后端交互——从服务器返回JSON数据
前后端分离开发中,前端通过HTTP请求获取后端数据,后端通常以JSON格式响应,以Python(后端Flask框架)和JavaScript(前端)为例:
后端:生成JSON响应
Flask框架中,可用 jsonify 将Python字典转换为JSON格式并返回(自动设置 Content-Type: application/json):
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/api/user')
def get_user():
# Python字典(模拟数据库查询结果)
user_data = {
"id": 1001,
"name": "李四",
"hobbies": ["阅读", "游泳"],
"info": None
}
# 转换为JSON并返回
return jsonify(user_data)
if __name__ == '__main__':
app.run()
前端:接收并解析JSON数据
前端通过 fetch API 发送请求,获取的响应体是JSON字符串,需用 .json() 方法解析:
// 发送GET请求获取用户数据
fetch('/api/user')
.then(response => {
// 检查响应状态(如200表示成功)
if (!response.ok) {
throw new Error('网络响应异常');
}
// 将响应体解析为JSON对象
return response.json();
})
.then(data => {
// 解析成功后,使用数据
console.log('用户ID:', data.id);
console.log('爱好:', data.hobbies); // 输出: ["阅读", "游泳"]
})
.catch(error => {
console.error('请求失败:', error);
});
场景2:跨系统API通信——客户端发送JSON数据
调用第三方API(如登录、支付接口)时,客户端需将请求数据封装为JSON格式,通过HTTP请求发送,以Python requests 库调用API为例:
客户端:发送JSON请求
假设有一个“用户注册”API,需发送POST请求,包含用户名和密码:
import requests
import json
# API地址
url = "https://api.example.com/register"
# 请求数据(Python字典)
payload = {
"username": "test_user",
"password": "123456",
"email": "test@example.com"
}
# 设置请求头(声明发送JSON数据)
headers = {
"Content-Type": "application/json"
}
# 发送POST请求(requests自动将字典转为JSON字符串)
response = requests.post(url, json=payload, headers=headers)
# 检查响应
if response.status_code == 201: # 201表示创建成功
result = response.json() # 将响应JSON转为Python字典
print("注册成功,用户ID:", result.get("user_id"))
else:
print("注册失败:", response.text)
关键点:
requests.post的json参数会自动将字典序列化为JSON字符串,并设置Content-Type: application/json;- 若手动序列化,可用
json.dumps(payload),但需自行设置请求头。
场景3:本地数据存储——用JSON文件保存配置或数据
JSON也常用于保存本地配置文件(如config.json)或小型数据集(如用户列表),以Python读写JSON文件为例:
写入JSON文件
将Python对象保存为JSON文件:
import json
# Python对象(模拟要保存的数据)
data = {
"app_name": "待办事项",
"version": "1.0",
"tasks": [
{"id": 1, "content": "学习JSON", "completed": True},
{"id": 2, "content": "写代码", "completed": False}
]
}
# 写入文件(默认使用UTF-8编码)
with open("tasks.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False) # indent=2格式化,ensure_ascii支持中文
print("数据已保存到tasks.json")
执行后生成的 tasks.json 内容:
{
"app_name": "待办事项",
"version": "1.0",
"tasks": [
{
"id": 1,
"content": "学习JSON",
"completed": true
},
{
"id": 2,
"content": "写代码",
"completed": false
}
]
}
读取JSON文件
从JSON文件加载数据到Python对象:
import json
# 读取JSON文件
with open("tasks.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f) # 直接转为Python字典
# 使用数据
print("应用名称:", loaded_data["app_name"])
for task in loaded_data["tasks"]:
print(f"任务{task['id']}: {task['content']} (完成: {task['completed']})")
输出:
应用名称: 待办事项
任务1: 学习JSON (完成: True)
任务2: 写


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