JSON轻松上手:从基础到实用实例详解
什么是JSON?
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,以易于人类阅读和编写的文本形式存储和传输数据,它基于JavaScript的一个子集,但已成为独立于语言的通用格式,广泛应用于前后端数据交互、API接口、配置文件等场景。
JSON的核心优势是简洁、结构清晰、易于解析,支持两种基本结构:
- 对象(Object):用 表示,键值对集合,键必须是字符串(双引号包裹),值可以是多种类型。
- 数组(Array):用
[]表示,有序值列表,值可以是多种类型。
JSON的基本语法规则
在了解实例前,需JSON的语法规范(否则可能导致解析失败):
- 键值对:
"key": value,键必须用双引号(不能用单引号),值可以是:- 基本类型:字符串(
"value")、数字(123)、布尔值(true/false)、null - 复合类型:对象()、数组(
[...])
- 基本类型:字符串(
- 分隔符:键值对之间用逗号()分隔,最后一个元素后不能加逗号(如
{"name": "Tom", "age": 18,}是错误的)。 - 嵌套结构:对象和数组可以多层嵌套,
{"user": {"name": "Tom"}, "hobbies": ["reading", "coding"]}。
JSON使用实例:从简单到复杂
通过实际场景JSON的用法,包括定义JSON数据、解析JSON(前端JavaScript/后端Python)、生成JSON。
实例1:定义简单的JSON数据——用户信息
假设存储一个用户的基本信息,包括姓名、年龄、邮箱和是否激活状态,JSON格式如下:
{
"name": "张三",
"age": 25,
"email": "zhangsan@example.com",
"isActive": true
}
- 解析:这是一个JSON对象,包含4个键值对,
"isActive"的值是布尔类型,符合JSON语法。
实例2:嵌套JSON数据——用户列表与订单
当数据结构更复杂时,可通过嵌套对象和数组实现,存储用户信息及其订单列表:
{
"userId": 1001,
"username": "李四",
"profile": {
"gender": "男",
"phone": "13812345678",
"address": {
"city": "北京",
"district": "朝阳区"
}
},
"orders": [
{
"orderId": "A001",
"product": "iPhone 15",
"price": 5999,
"date": "2023-10-01"
},
{
"orderId": "A002",
"product": "AirPods Pro",
"price": 1999,
"date": "2023-10-05"
}
],
"isVip": false
}
- 结构说明:
"profile"是嵌套对象,存储用户详细信息,其中"address"再次嵌套对象;"orders"是数组,每个元素是一个订单对象,包含订单ID、商品、价格和日期;- 多层嵌套让数据层次清晰,适合复杂业务场景。
实例3:前端JavaScript中解析JSON(字符串→对象)
前端从API获取的数据通常是JSON字符串,需通过JSON.parse()转换为JavaScript对象操作。
场景:假设后端返回用户信息的JSON字符串,前端解析并提取数据。
// 1. JSON字符串(通常从API响应获取)
const userJsonStr = '{"name": "王五", "age": 30, "skills": ["JavaScript", "Python", "SQL"]}';
// 2. 解析为JavaScript对象
const userObj = JSON.parse(userJsonStr);
// 3. 操作对象数据
console.log("用户名:", userObj.name); // 输出: 用户名: 王五
console.log("技能列表:", userObj.skills); // 输出: 技能列表: ["JavaScript", "Python", "SQL"]
console.log("第一个技能:", userObj.skills[0]); // 输出: 第一个技能: JavaScript
注意:如果JSON字符串格式错误(如单引号、末尾逗号),JSON.parse()会抛出异常,需用try-catch处理:
try {
const invalidJson = '{"name": "赵六", "age": 28,}'; // 错误:末尾逗号
const obj = JSON.parse(invalidJson);
} catch (error) {
console.error("JSON解析失败:", error.message); // 输出: JSON解析失败: Unexpected token }
}
实例4:前端JavaScript中生成JSON(对象→字符串)
前端向服务器发送数据时,常需将JavaScript对象转换为JSON字符串,通过JSON.stringify()实现。
场景:用户填写表单后,将表单数据转换为JSON字符串提交给后端。
// 1. JavaScript对象(表单数据)
const formData = {
username: "钱七",
password: "123456",
preferences: {
theme: "dark",
language: "zh-CN"
},
notifications: ["email", "sms"]
};
// 2. 转换为JSON字符串
const formDataJson = JSON.stringify(formData);
// 3. 发送到后端(模拟fetch请求)
fetch("/api/user/register", {
method: "POST",
headers: {
"Content-Type": "application/json" // 告知后端发送的是JSON数据
},
body: formDataJson // 发送JSON字符串
})
.then(response => response.json())
.then(data => console.log("后端响应:", data))
.catch(error => console.error("请求失败:", error));
// 输出formDataJson(格式化后的字符串)
// {
// "username": "钱七",
// "password": "123456",
// "preferences": {
// "theme": "dark",
// "language": "zh-CN"
// },
// "notifications": ["email", "sms"]
// }
进阶:JSON.stringify()支持参数控制格式,如缩进和过滤属性:
// 只保留username和preferences,并格式化输出(缩进2空格)
const filteredJson = JSON.stringify(formData, ["username", "preferences"], 2);
console.log(filteredJson);
// 输出:
// {
// "username": "钱七",
// "preferences": {
// "theme": "dark",
// "language": "zh-CN"
// }
// }
实例5:后端Python中解析与生成JSON
Python内置json模块,可轻松处理JSON数据,常用于Web框架(如Django、Flask)的API开发。
场景1:解析前端发送的JSON字符串(如HTTP请求体)
import json
# 1. 模拟前端发送的JSON字符串
request_body = '{"user_id": 2001, "action": "login", "timestamp": "2023-10-10 12:00:00"}'
# 2. 解析为Python字典
data = json.loads(request_body)
# 3. 操作字典数据
print(f"用户ID: {data['user_id']}, 动作: {data['action']}")
# 输出: 用户ID: 2001, 动作: login
# 4. 处理嵌套JSON
nested_json = '{"order": {"id": "B001", "items": [{"name": "MacBook", "qty": 1}]}}'
nested_data = json.loads(nested_json)
print(f"商品名称: {nested_data['order']['items'][0]['name']}")
# 输出: 商品名称: MacBook
场景2:生成JSON字符串响应给前端
import json
# 1. Python字典(后端处理的数据)
response_data = {
"status": "success",
"message": "登录成功",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user_info": {
"nickname": "Python开发者",
"level": 5
}
}
# 2. 转换为JSON字符串(ensure_ascii=False支持中文)
response_json = json.dumps(response_data, ensure_ascii=False, indent=2)
# 3. 返回HTTP响应(模拟Flask框架)
print("Content-Type: application/json") # 告诉浏览器返回JSON
print("") # 空行分隔Header和Body
print(response_json)
# �


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