用JSON轻松存储与获取数据:从入门到实践
在当今数据驱动的时代,如何高效、灵活地存储和传输数据是开发者必须的技能,JSON(JavaScript Object Notation,JavaScript对象表示法)作为一种轻量级的数据交换格式,因其简洁、易读、跨语言兼容的特性,已成为Web开发、移动应用开发乃至数据存储领域的“通用语言”,本文将详细介绍如何用JSON存储数据和获取数据,从基础概念到实际代码示例,带你快速上手。
JSON是什么?为什么用它存储和获取数据?
JSON本质上是一种文本格式,它以“键值对”(Key-Value Pair)的方式组织数据,结构清晰且易于人类阅读和机器解析,与XML、CSV等格式相比,JSON的优势在于:
- 轻量级:数据冗余少,传输效率高(如XML需大量标签,而JSON用和
[]简化结构)。 - 跨语言兼容:几乎所有编程语言(如Python、Java、JavaScript、C#等)都内置了JSON解析库,无需额外工具。
- 数据类型丰富:支持字符串、数字、布尔值、数组、对象(字典)、null等多种数据类型,能灵活表达复杂结构。
JSON的基础语法:数据的“骨架”
要使用JSON存储和获取数据,首先要其语法规则,JSON的数据结构主要有两种:对象和数组。
JSON对象(Object):键值对的集合
用花括号包裹,多个键值对用逗号分隔,键(Key)必须是字符串(需用双引号包围),值(Value)可以是多种数据类型。
示例:
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "英语", "编程"],
"address": {
"city": "北京",
"district": "海淀区"
},
"score": null
}
- 键:
"name"、"age"等; - 值:
"张三"(字符串)、25(数字)、false(布尔值)、["数学", "英语", "编程"](数组)、{"city": "北京", "district": "海淀区"}(嵌套对象)、null。
JSON数组(Array):有序值的集合
用方括号[]包裹,多个值用逗号分隔,值可以是任意JSON数据类型(包括对象和数组)。
示例:
[
{"id": 1, "name": "商品A", "price": 99.9},
{"id": 2, "name": "商品B", "price": 149.0},
{"id": 3, "name": "商品C", "price": 299.5}
]
这是一个包含3个对象的数组,每个对象代表一个商品信息。
语法规则总结
- 数据以键值对形式存在(对象中)或有序列表形式存在(数组中);
- 键必须用双引号,值如果是字符串也需用双引号;
- 末尾不能有逗号(如
{"name": "张三",}是错误的); - 支持嵌套(对象内嵌套对象或数组,数组内嵌套对象或数组)。
用JSON存储数据:从内存到文件/数据库
JSON存储数据的核心是“将内存中的数据结构转换为JSON字符串”,并持久化保存(如写入文件、存入数据库等),不同编程语言的实现方式略有差异,但逻辑一致。
示例1:Python中存储JSON数据
Python内置了json模块,通过json.dump()和json.dumps()实现存储。
json.dumps():将Python对象转换为JSON字符串(内存中);json.dump():将Python对象转换为JSON字符串并直接写入文件(持久化)。
代码示例:
import json
# 1. 定义Python数据(字典/列表)
data = {
"name": "李四",
"age": 30,
"hobbies": ["阅读", "旅行", "摄影"],
"contact": {
"email": "lisi@example.com",
"phone": "13800138000"
}
}
# 2. 转换为JSON字符串(内存中)
json_str = json.dumps(data, ensure_ascii=False, indent=4)
print("JSON字符串:")
print(json_str)
# 3. 存储到文件(持久化)
with open("user.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4) # ensure_ascii=False支持中文,indent=4格式化
print("数据已保存到user.json文件")
输出文件(user.json):
{
"name": "李四",
"age": 30,
"hobbies": [
"阅读",
"旅行",
"摄影"
],
"contact": {
"email": "lisi@example.com",
"phone": "13800138000"
}
}
示例2:JavaScript(Node.js)中存储JSON数据
JavaScript原生支持JSON,通过JSON.stringify()将对象转为字符串,再通过文件系统模块(如fs)写入文件。
代码示例(Node.js):
const fs = require('fs');
// 1. 定义JavaScript对象
const data = {
name: "王五",
age: 28,
skills: ["JavaScript", "Python", "React"],
"work-experience": [
{"company": "ABC科技", "year": 2020},
{"company": "XYZ互联网", "year": 2022}
]
};
// 2. 转换为JSON字符串
const jsonStr = JSON.stringify(data, null, 2); // null表示不过滤属性,2表示缩进2空格
console.log("JSON字符串:", jsonStr);
// 3. 存储到文件
fs.writeFileSync('profile.json', jsonStr, 'utf8');
console.log("数据已保存到profile.json文件");
其他场景:存储到数据库
许多现代数据库(如MongoDB、Redis)直接支持JSON格式数据,或将其作为主要存储方式(如MongoDB的BSON是JSON的二进制扩展),以MongoDB为例,插入JSON数据只需将对象直接传入:
// MongoDB插入示例(Node.js驱动)
const db = client.db('testDB');
const usersCollection = db.collection('users');
await usersCollection.insertOne({
name: "赵六",
age: 35,
tags: ["管理员", "VIP用户"]
});
用JSON获取数据:从文件/数据库到内存
获取数据的流程与存储相反:读取JSON字符串 → 解析为编程语言原生对象,核心是“反序列化”——将文本格式的JSON数据还原为内存中的数据结构(如Python的字典、JavaScript的对象)。
示例1:Python中获取JSON数据
Python的json模块通过json.load()和json.loads()实现获取。
json.loads():将JSON字符串解析为Python对象(内存中);json.load():从文件流中读取JSON字符串并解析为Python对象。
代码示例:
import json
# 1. 从文件读取JSON数据
with open("user.json", "r", encoding="utf-8") as f:
data = json.load(f) # 直接解析为Python字典
print("从文件读取的数据:")
print(f"姓名: {data['name']}")
print(f"爱好: {data['hobbies']}")
print(f"邮箱: {data['contact']['email']}")
# 2. 从JSON字符串解析数据(模拟从API响应获取)
json_str = '{"id": 101, "status": "success", "message": "操作完成"}'
response = json.loads(json_str) # 解析为字典
print("\n从字符串解析的数据:")
print(f"状态码: {response['status']}, 消息: {response['message']}")
示例2:JavaScript中获取JSON数据
JavaScript通过JSON.parse()将JSON字符串解析为对象,再通过文件系统模块读取文件内容。
代码示例(Node.js):
const fs = require('fs');
// 1. 从文件读取JSON数据
const fileContent = fs.readFileSync('profile.json', 'utf8'); // 读取文件内容(字符串)
const data = JSON.parse(fileContent); // 解析为JavaScript对象
console.log("从文件读取的数据:");
console.log(`姓名: ${data.name}`);
console.log(`技能: ${data.skills.join(', ')}`);
console.log(`第一段工作经验: ${data['work-experience'][0].company}`);


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