做网页开发时,经常会遇到需要从服务器动态加载数据的场景。比如用户在登录框输入账号密码,点击登录后页面不刷新就能提示成功或失败,背后用的就是 Ajax 技术。而服务器返回的数据格式,大多数时候是 JSON,怎么正确接收并解析这些数据,就成了前端开发中的基本功。
Ajax 请求的基本结构
先来看一个常见的 jQuery 版本的 Ajax 请求示例。假设我们要从后台获取用户信息:
$.ajax({
url: '/api/user/info',
type: 'GET',
dataType: 'json',
success: function(response) {
console.log(response);
},
error: function(xhr, status, err) {
console.error('请求出错:', err);
}
});
这里的 dataType: 'json' 很关键,它告诉 jQuery:“我期望服务器返回的是 JSON 数据,你帮我自动解析成 JavaScript 对象”。如果服务器确实返回了合法的 JSON 字符串,比如 {"name": "张三", "age": 28},jQuery 就会自动把它转成对象,直接在 success 回调中使用。
手动解析 JSON 的情况
有时候我们不用 jQuery,或者 dataType 没设对,服务器返回的其实是字符串。这时候就得手动解析。例如原生 JavaScript 发起请求:
fetch('/api/user/info')
.then(response => response.text())
.then(data => {
let jsonObj = JSON.parse(data);
console.log(jsonObj.name);
})
.catch(err => {
console.error('解析失败:', err);
});
注意这里用了 response.text() 获取原始文本,然后通过 JSON.parse() 手动转成对象。如果返回的内容不是合法 JSON,比如后台报错了返回了一段 HTML,JSON.parse() 就会抛异常,程序中断。所以更稳妥的做法是加个 try-catch:
try {
let jsonObj = JSON.parse(data);
console.log('解析成功:', jsonObj);
} catch (e) {
console.error('JSON 格式错误,无法解析:', data);
}
常见问题和排查思路
实际开发中,经常有人问“为什么我的 response 打印出来是字符串而不是对象?” 原因通常是:dataType 没设置,或者服务器返回的 MIME 类型不对。浏览器判断不了这是 JSON,就不会自动转换。
另一个典型问题是后台拼接字符串返回 JSON,格式写错了。比如少了个引号或多了一个逗号,导致 JSON 不合法。这种情况下前端解析必然失败。建议后台用成熟的 JSON 序列化方法输出,比如 PHP 用 json_encode(),Java 用 Jackson 或 Fastjson,避免手动生成。
还有一种情况是跨域请求,预检失败或者没开 CORS,根本拿不到数据。这时候看浏览器控制台的 Network 面板,一眼就能看出请求是否真正成功。
真实开发场景举例
想象你在做一个商品搜索页,用户输入关键词,下面实时列出结果。每次输入变化就发一次 Ajax 请求,后端返回 JSON 格式的商品列表:
{
"code": 0,
"msg": "ok",
"data": [
{"id": 1, "name": "手机", "price": 2999},
{"id": 2, "name": "平板", "price": 1999}
]
}
前端收到后先判断 code 是否为 0,再遍历 data 渲染到页面:
success: function(res) {
if (res.code === 0 && Array.isArray(res.data)) {
let html = '';
res.data.forEach(item => {
html += '<li>' + item.name + ' - ¥' + item.price + '</li>';
});
document.getElementById('list').innerHTML = '<ul>' + html + '</ul>';
} else {
alert('加载失败:' + res.msg);
}
}
这种结构化的响应设计,加上前端对 JSON 的正确解析,才能让页面交互流畅又稳定。