在日常开发中,经常需要从服务器获取数据,而这些数据大多以 JSON 格式传输。比如调用天气 API 时,返回的是一串字符串形式的 JSON,像这样:{"city": "北京", "temperature": 26}。但要在 JavaScript 中操作这些数据,就得先把它变成真正的 JS 对象。
使用 JSON.parse() 转换
最常用的方法是 JSON.parse()。它能将符合格式的 JSON 字符串解析成对应的 JS 对象。
const jsonString = '{"name": "小明", "age": 30, "city": "上海"}';
const obj = JSON.parse(jsonString);
console.log(obj.name); // 输出:小明
这个方法简单直接,适合大多数场景。只要确保传入的是合法的 JSON 字符串,否则会抛出语法错误。
处理异步请求中的转换
实际项目里,JSON 数据通常来自网络请求。例如用 fetch 获取用户列表:
fetch('/api/users')
.then(response => response.text())
.then(data => {
const users = JSON.parse(data);
console.log(users);
});
也可以直接用 response.json(),它内部已经完成了字符串到对象的转换:
fetch('/api/users')
.then(response => response.json())
.then(users => {
console.log(users);
});
注意特殊情况
不是所有看起来像 JSON 的字符串都能成功解析。比如属性名没用双引号包裹,或者用了单引号,都会导致失败。
// 这些写法是错误的
JSON.parse("{name: '张三'}"); // 属性名没引号
JSON.parse('{"name": '李四'}'); // 值用了单引号
正确的 JSON 必须使用双引号包裹键和字符串值。如果后端返回的数据格式不规范,需要先处理字符串再解析。
自定义转换逻辑
有时候不只是简单转换,还想在过程中处理某些字段。比如时间戳自动转日期:
const jsonString = '{"name": "订单1", "time": 1712054400000}';
const order = JSON.parse(jsonString, (key, value) => {
if (key === 'time') {
return new Date(value);
}
return value;
});
console.log(order.time); // 输出一个 Date 对象
第二个参数是还原函数,可以对每个键值对进行加工,适合需要统一处理数据类型的情况。