JavaScript 获取本地 JSON 数据的实用指南**
在 Web 开发中,JSON(JavaScript Object Notation)因其轻量级、易读易写的特性,成为了数据交换的主流格式之一,有时,我们需要在 JavaScript 应用中直接使用存储在本地的 JSON 数据,例如开发原型、小型应用或离线功能,本文将详细介绍几种 JavaScript 获取本地 JSON 数据的常用方法,并分析其适用场景。
直接内联 JSON 数据
最简单直接的方式是将 JSON 数据直接写在 JavaScript 代码中,作为一个变量或常量。
方法:
在 <script> 标签内或独立的 .js 文件中,直接定义一个 JSON 对象。
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">内联JSON示例</title>
</head>
<body>
<script>
// 直接定义JSON数据
const localJsonData = {
"users": [
{"id": 1, "name": "Alice", "email": "alice@example.com"},
{"id": 2, "name": "Bob", "email": "bob@example.com"}
],
"settings": {
"theme": "dark",
"notifications": true
}
};
// 直接使用数据
console.log("用户列表:", localJsonData.users);
console.log("第一个用户:", localJsonData.users[0].name);
</script>
</body>
</html>
优点:
- 简单直接,无需额外请求。
- 加载速度快,适合小型、固定的数据。
缺点:
- 数据修改需要改动代码,不适合频繁变化的大量数据。
- 数据会随着 JavaScript 文件一起加载,可能增加初始加载时间。
通过 <script> 标签加载外部 JSON 文件
可以将 JSON 数据保存在一个单独的 .json 文件中,然后通过 <script> 标签引入,需要注意的是,出于安全考虑,直接通过 <script src="data.json"></script> 加载 JSON 文件可能会遇到 CORS(跨域资源共享)问题,或者浏览器会将其作为 JavaScript 代码执行而非 JSON 数据解析。
更稳妥的方式是使用 fetch API 或 XMLHttpRequest 来加载,但这里先介绍一种利用 <script> 标签 onload 事件的方式,前提是服务器配置正确或 JSON 文件实际上是有效的 JavaScript 模块(包装成一个 export)。
更常见的“外部 JSON 文件”加载是指通过 AJAX 请求,见下一方法。
使用 fetch API 加载本地 JSON 文件(推荐)
fetch API 是现代 JavaScript 中进行网络请求的强大工具,也可以用于加载本地文件(在浏览器环境中,这通常是通过 file:// 协议或本地开发服务器实现的)。
方法:
使用 fetch() 函数获取 JSON 文件,然后使用 .json() 方法解析响应。
示例:
假设有一个 data.json 文件,内容如下:
{
"products": [
{"id": "p1", "name": "产品A", "price": 100},
{"id": "p2", "name": "产品B", "price": 200}
]
}
HTML 文件中:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">Fetch JSON示例</title>
</head>
<body>
<div id="product-list"></div>
<script>
async function loadJsonData() {
try {
const response = await fetch('data.json'); // 确保data.json与HTML同目录或提供正确路径
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
console.log("成功加载JSON数据:", data);
// 简单渲染数据到页面
const productList = document.getElementById('product-list');
data.products.forEach(product => {
const productElement = document.createElement('div');
productElement.textContent = `${product.name} - ¥${product.price}`;
productList.appendChild(productElement);
});
} catch (error) {
console.error("加载JSON数据失败:", error);
}
}
loadJsonData();
</script>
</body>
</html>
优点:
- 异步加载,不阻塞页面渲染。
- 现代浏览器广泛支持。
- 适合从本地或远程服务器加载 JSON 数据。
注意事项:
- CORS 问题:如果直接在浏览器中打开 HTML 文件(通过
file://协议),fetch本地 JSON 文件可能会因为 CORS 策略而失败,最佳实践是使用本地开发服务器(如 VS Code 的 Live Server 插件、Python 的http.server等)来运行你的项目。 - 错误处理:务必使用
try...catch和检查response.ok来处理可能的错误。
使用 XMLHttpRequest (XHR) 加载本地 JSON 文件
XMLHttpRequest 是 fetch API 之前用于创建 HTTP 请求的传统方法,现在仍然被广泛支持,尤其是在需要兼容旧版浏览器的场景。
方法:
创建 XHR 对象,配置请求方法和 URL,监听 onload 事件(请求成功时)和 onerror 事件(请求失败时),然后在 onload 中解析响应数据。
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">XHR JSON示例</title>
</head>
<body>
<div id="xhr-product-list"></div>
<script>
function loadJsonWithXHR() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'data.json', true); // true表示异步
xhr.onload = function() {
if (xhr.status >= 200 && xhr.status < 300) {
const data = JSON.parse(xhr.responseText);
console.log("XHR成功加载JSON数据:", data);
// 简单渲染数据到页面
const productList = document.getElementById('xhr-product-list');
data.products.forEach(product => {
const productElement = document.createElement('div');
productElement.textContent = `${product.name} - ¥${product.price}`;
productList.appendChild(productElement);
});
} else {
console.error(`XHR请求失败,状态码: ${xhr.status}`);
}
};
xhr.onerror = function() {
console.error("XHR请求发生错误");
};
xhr.send();
}
loadJsonWithXHR();
</script>
</body>
</html>
优点:
- 兼容性非常好,包括非常老的浏览器。
- 提供了更详细的请求状态信息。
缺点:
- API 相比
fetch更冗长。 - 处理异步回调不如
fetch的 Promise 链式调用直观。
使用 ES6 Modules 加载本地 JSON 文件(现代环境)
在一些现代浏览器和构建工具(如 Vite, Webpack)的支持下,可以直接通过 ES6 Modules 的 import 语句导入 JSON 文件,构建工具通常会将其转换为 fetch 或其他方式处理,但原生支持也在逐步推广。
方法:
使用 import jsonPath from './data.json'; 的语法。
示例 (需要服务器支持 ES Modules):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">ES Module JSON示例</title>
</head>
<body>
<script type="module">
import jsonData from './data.json';
console.log("ES Module导入的JSON数据:", jsonData);
// 使用数据...
</script>
</body>
</html>
优点:
- 语法简洁,符合模块化开发思想。
- 构建工具可以提供优化和类型检查(配合 TypeScript)。
缺点:
- 原生浏览器支持有限,通常需要构建工具或服务器特定配置。
- 直接在 HTML 文件中使用
type="module"时,同样需要注意 CORS 问题,最好通过本地服务器运行。
使用 localStorage 或 sessionStorage 存储和获取 JSON 数据
JSON 数据是用户生成的,或者需要持久化存储在浏览器端,可以使用 localStorage 或 sessionStorage。
方法:
- 存储:
localStorage.setItem('myJsonData', JSON.stringify(yourJsonObject)); - 获取:
const data = JSON.parse(localStorage.getItem('myJsonData'));
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">LocalStorage JSON示例</title>
</head>
<body>
<button id="save-btn">保存数据到LocalStorage</button>
<button id="load-btn">从加载数据</button>
<div id="output"></div>
<script>
const dataToSave = { message: "Hello from localStorage!", timestamp: Date


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