您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# JS中Json字符串+Cookie+localStorage怎么用
## 前言
在现代Web开发中,数据存储和传输是核心需求。JSON作为轻量级数据交换格式,与浏览器端的Cookie和localStorage结合使用,能实现复杂数据的持久化和状态管理。本文将深入探讨三者的配合使用技巧。
## 一、JSON字符串基础
### 1.1 什么是JSON
JSON(JavaScript Object Notation)是一种基于文本的数据格式,采用完全独立于语言的文本格式,但使用了类似于JavaScript对象的语法。
```javascript
// JSON示例
const user = {
"name": "张三",
"age": 30,
"isAdmin": true,
"hobbies": ["阅读", "编程"]
};
将JavaScript对象转换为JSON字符串:
const obj = { name: "李四", score: 85 };
const jsonStr = JSON.stringify(obj);
console.log(jsonStr); // "{"name":"李四","score":85}"
将JSON字符串转换为JavaScript对象:
const jsonStr = '{"name":"王五","active":false}';
const obj = JSON.parse(jsonStr);
console.log(obj.name); // "王五"
Cookie是服务器发送到用户浏览器并保存在本地的小型数据(通常不超过4KB)。
document.cookie = "username=John; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";
console.log(document.cookie); // "username=John; theme=dark"
const userSettings = {
theme: "dark",
fontSize: 14,
lastVisit: new Date()
};
// 转换为JSON并编码
const encodedSettings = encodeURIComponent(JSON.stringify(userSettings));
document.cookie = `userSettings=${encodedSettings}; max-age=3600`;
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}
const savedSettings = JSON.parse(decodeURIComponent(getCookie('userSettings')));
console.log(savedSettings.theme); // "dark"
localStorage是HTML5提供的本地存储方案,容量更大(通常5MB),数据不会随请求发送到服务器。
// 存储
localStorage.setItem('key', 'value');
// 读取
const value = localStorage.getItem('key');
// 删除
localStorage.removeItem('key');
// 清空
localStorage.clear();
const shoppingCart = {
items: [
{ id: 1, name: "商品A", quantity: 2 },
{ id: 3, name: "商品C", price: 99 }
],
total: 198,
currency: "CNY"
};
localStorage.setItem('cart', JSON.stringify(shoppingCart));
const savedCart = JSON.parse(localStorage.getItem('cart'));
if (savedCart) {
console.log(`总价: ${savedCart.total}${savedCart.currency}`);
}
function setWithExpiry(key, value, expirySeconds) {
const item = {
value: value,
expiry: Date.now() + expirySeconds * 1000
};
localStorage.setItem(key, JSON.stringify(item));
}
function getWithExpiry(key) {
const itemStr = localStorage.getItem(key);
if (!itemStr) return null;
const item = JSON.parse(itemStr);
if (Date.now() > item.expiry) {
localStorage.removeItem(key);
return null;
}
return item.value;
}
// 保存设置
function saveUserPreferences(prefs) {
// 短期设置用Cookie(如会话偏好)
document.cookie = `tempPrefs=${encodeURIComponent(JSON.stringify({
theme: prefs.theme,
lastUpdated: new Date()
}))}; max-age=86400`;
// 长期设置用localStorage
localStorage.setItem('userPreferences', JSON.stringify({
fontSize: prefs.fontSize,
notifications: prefs.notifications,
language: prefs.language
}));
}
// 加载设置
function loadUserPreferences() {
const preferences = {};
// 从Cookie加载临时设置
const cookieValue = getCookie('tempPrefs');
if (cookieValue) {
Object.assign(preferences, JSON.parse(decodeURIComponent(cookieValue)));
}
// 从localStorage加载持久设置
const storedPrefs = localStorage.getItem('userPreferences');
if (storedPrefs) {
Object.assign(preferences, JSON.parse(storedPrefs));
}
return preferences;
}
class ShoppingCart {
constructor() {
this.cart = this.loadCart();
}
loadCart() {
// 尝试从Cookie获取(兼容无localStorage情况)
let cart;
const cookieCart = getCookie('shoppingCart');
if (cookieCart) {
cart = JSON.parse(decodeURIComponent(cookieCart));
} else {
// 从localStorage获取
const storedCart = localStorage.getItem('shoppingCart');
cart = storedCart ? JSON.parse(storedCart) : { items: [] };
}
return cart;
}
saveCart() {
const cartStr = JSON.stringify(this.cart);
// 同时保存到Cookie和localStorage
document.cookie = `shoppingCart=${encodeURIComponent(cartStr)}; max-age=604800`;
localStorage.setItem('shoppingCart', cartStr);
}
addItem(product, quantity = 1) {
// ...添加商品逻辑
this.saveCart();
}
// 其他方法...
}
const CryptoJS = require("crypto-js");
function secureStore(key, data, secret) {
const encrypted = CryptoJS.AES.encrypt(
JSON.stringify(data),
secret
).toString();
localStorage.setItem(key, encrypted);
}
function secureRetrieve(key, secret) {
const encrypted = localStorage.getItem(key);
if (!encrypted) return null;
const bytes = CryptoJS.AES.decrypt(encrypted, secret);
return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
}
function safeSetItem(key, value) {
try {
localStorage.setItem(key, value);
return true;
} catch (e) {
if (e.name === 'QuotaExceededError') {
// 处理存储空间不足
console.warn('存储空间不足,正在清理过期数据...');
clearExpiredItems();
try {
localStorage.setItem(key, value);
return true;
} catch (e) {
return false;
}
}
return false;
}
}
// 批量读取
function batchGetItems(keys) {
return keys.reduce((result, key) => {
const value = localStorage.getItem(key);
if (value !== null) {
result[key] = JSON.parse(value);
}
return result;
}, {});
}
// 批量写入
function batchSetItems(items) {
Object.entries(items).forEach(([key, value]) => {
localStorage.setItem(key, JSON.stringify(value));
});
}
对于大型数据,可以考虑压缩:
import LZString from 'lz-string';
function compressAndStore(key, data) {
const compressed = LZString.compress(JSON.stringify(data));
localStorage.setItem(key, compressed);
}
function decompressAndLoad(key) {
const compressed = localStorage.getItem(key);
if (!compressed) return null;
return JSON.parse(LZString.decompress(compressed));
}
// 检测localStorage支持
function isLocalStorageSupported() {
try {
const testKey = '__test__';
localStorage.setItem(testKey, testKey);
localStorage.removeItem(testKey);
return true;
} catch (e) {
return false;
}
}
// 回退方案
function getBestStorage() {
return isLocalStorageSupported() ? localStorage : {
setItem: (key, value) => {
document.cookie = `${key}=${encodeURIComponent(value)}; max-age=31536000`;
},
getItem: (key) => {
const value = getCookie(key);
return value ? decodeURIComponent(value) : null;
}
};
}
JSON与Cookie/localStorage的组合为前端数据管理提供了强大而灵活的解决方案。掌握它们的特性和最佳实践,可以构建出既功能丰富又用户体验良好的Web应用。在实际开发中,应根据数据敏感性、生命周期和大小需求,合理选择存储方案。
提示:现代浏览器还提供了IndexedDB等更强大的存储方案,适合存储更大量结构化数据,可作为localStorage的进阶替代方案。 “`
这篇文章总计约3150字,涵盖了JSON、Cookie和localStorage的基础知识、组合使用方法、实际应用场景以及安全性和性能方面的考虑,采用Markdown格式编写,包含代码示例和结构化标题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。