JavaScript如何将数据存入JSON文件及对象
在Web开发中,JSON(JavaScript Object Notation)因其轻量级、易读性和与JavaScript的天然兼容性,成为数据存储与交换的主流格式,本文将详细介绍JavaScript中将数据存入JSON的多种方式,包括操作JSON对象、将数据写入JSON文件,以及处理复杂数据结构的注意事项。
理解JSON与JavaScript对象的关系
首先需要明确:JSON是一种数据格式,而JavaScript对象(Object)是JS中的数据类型,两者语法高度相似,但存在关键区别:
- JSON的键名必须用双引号包裹,JavaScript对象的键名可以用单引号、双引号或不加引号(标识符符合命名规则时);
- JSON的值只能是:字符串(双引号)、数字、布尔值、null、数组或JSON对象,不能包含函数、日期、undefined等JavaScript特有类型;
- JSON字符串最外层必须是或
[],且不能有尾随逗号。
一个JavaScript对象:
const jsObj = {
name: "Alice",
age: 25,
hobbies: ["reading", "coding"],
sayHi: function() { console.log("Hi!"); }
};
对应的JSON字符串(需转换):
{
"name": "Alice",
"age": 25,
"hobbies": ["reading", "coding"]
}
(注意:sayHi函数会被忽略,因为JSON不支持函数)
将数据存入JSON对象(内存中操作)
如果只是想在JavaScript内存中将数据组织成JSON格式,本质是创建或修改JavaScript对象,必要时可转换为JSON字符串。
直接创建JSON对象
直接通过字面量创建符合JSON格式的JavaScript对象:
const jsonData = {
"id": 1,
"product": "Laptop",
"price": 5999,
"inStock": true
};
console.log(jsonData); // 输出对象
此时jsonData是JavaScript对象,可直接访问和修改:
jsonData.price = 5599; // 修改数据 jsonData.category = "Electronics"; // 添加新数据
动态添加/修改数据
通过赋值操作向JSON对象(本质是JS对象)添加或修改键值对:
let emptyJson = {}; // 空对象
emptyJson["username"] = "Bob"; // 添加字符串键
emptyJson[0] = "first"; // 添加数字键(不推荐,JSON规范中键应为字符串)
emptyJson.isActive = true; // 添加布尔值键
console.log(emptyJson);
// 输出: { username: 'Bob', '0': 'first', isActive: true }
注意:数字键会被转换为字符串,但JSON规范中建议键名使用字符串。
将JS对象转换为JSON字符串
若需要将数据以JSON格式存储(如发送给服务器或写入文件),需用JSON.stringify()将JS对象转换为JSON字符串:
const user = {
name: "Charlie",
age: 30,
skills: ["JavaScript", "Python"]
};
const jsonString = JSON.stringify(user);
console.log(jsonString);
// 输出: '{"name":"Charlie","age":30,"skills":["JavaScript","Python"]}'
JSON.stringify()还支持两个可选参数:
-
replacer :过滤或转换数据,可以是函数或数组。
- 函数:遍历每个键值对,返回值会被替换(返回
undefined则删除该属性); - 数组:只保留数组中指定的键名。
// 使用replacer函数过滤敏感信息 const safeJson = JSON.stringify(user, (key, value) => { if (key === "age") return undefined; // 不保留age return value; }); console.log(safeJson); // 输出: '{"name":"Charlie","skills":["JavaScript","Python"]}'
// 使用replacer数组只保留指定键 const partialJson = JSON.stringify(user, ["name", "skills"]); console.log(partialJson); // 输出: '{"name":"Charlie","skills":["JavaScript","Python"]}'
- 函数:遍历每个键值对,返回值会被替换(返回
-
space :格式化JSON字符串,用于美化输出(值为数字时表示缩空格数,字符串时用该字符串缩进)。
const prettyJson = JSON.stringify(user, null, 2); // 缩进2个空格 console.log(prettyJson); /* 输出: { "name": "Charlie", "age": 30, "skills": [ "JavaScript", "Python" ] } */
将数据存入JSON文件(持久化存储)
若需将数据长期保存(如用户配置、本地缓存),需将JSON字符串写入文件,浏览器环境和Node.js环境操作方式不同。
浏览器环境:使用localStorage或sessionStorage
浏览器提供的localStorage和sessionStorage只能存储字符串,因此需将JSON对象转换为字符串存储,读取时再解析。
示例:存储用户偏好设置
const preferences = {
theme: "dark",
fontSize: 16,
notifications: true
};
// 存储数据(转换为JSON字符串)
localStorage.setItem("userPreferences", JSON.stringify(preferences));
// 读取数据(解析为JS对象)
const storedPrefs = JSON.parse(localStorage.getItem("userPreferences"));
console.log(storedPrefs.theme); // 输出: "dark"
// 更新数据(先读取修改,再重新存储)
storedPrefs.fontSize = 18;
localStorage.setItem("userPreferences", JSON.stringify(storedPrefs));
特点:
localStorage:永久存储(除非手动清除),容量约5MB;sessionStorage:会话级别关闭页面后清除,容量同localStorage。
Node.js环境:使用文件系统(fs模块)
Node.js中可通过内置的fs(File System)模块将JSON字符串写入文件,常用方法有fs.writeFileSync(同步)和fs.promises.writeFile(异步Promise)。
示例:同步写入JSON文件
const fs = require("fs");
// 要存储的数据
const userData = {
id: 101,
username: "node_user",
createdAt: new Date().toISOString()
};
// 转换为JSON字符串(replacer过滤掉函数,如Date对象会被转为字符串)
const jsonString = JSON.stringify(userData, null, 2);
// 写入文件(路径:./data/user.json)
try {
fs.writeFileSync("./data/user.json", jsonString, "utf8");
console.log("数据已成功写入JSON文件");
} catch (error) {
console.error("写入文件失败:", error);
}
注意:
- 需确保目录存在(如
./data),否则会报错,可用fs.mkdirSync创建目录; - 若数据包含Date对象等特殊类型,需用
replacer处理,否则会被转为ISO字符串。
示例:异步写入(Promise)
const fs = require("fs").promises;
async function writeJsonFile() {
const data = { name: "Async Data", value: 123 };
const jsonString = JSON.stringify(data, null, 2);
try {
await fs.writeFile("./data/asyncData.json", jsonString, "utf8");
console.log("异步写入成功");
} catch (error) {
console.error("异步写入失败:", error);
}
}
writeJsonFile();
浏览器环境:下载JSON文件(通过Blob)
若需让用户下载JSON文件(如导出数据),可通过Blob和URL.createObjectURL实现:
function downloadJson(data, filename) {
const jsonString = JSON.stringify(data, null, 2);
const blob = new Blob([jsonString], { type: "application/json" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = filename || "data.json";
document.body.appendChild(a);
a.click();
// 清理
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
// 使用示例
const exportData = { items: [1, 2, 3], total: 6 };
downloadJson(exportData, "export.json");
处理复杂数据结构的注意事项
实际开发中,数据可能包含循环引用、特殊类型(Date、Map、Set等),需额外处理:
循环引用
若对象存在循环引用(如a.b = a),JSON.stringify()会直接报错:
const obj = { name: "Loop" };
obj.self = obj; // 循环引用
JSON.stringify(obj); // 报错: "TypeError: Converting circular structure to JSON"


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