在Javascript开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,凭借结构简单、易读易写的特性,被广泛应用于前后端数据交互、本地数据存储等场景。对JSON数据进行序列化和解析是Javascript操作JSON的核心能力,下面我们就来详细了解相关的实现方法。

JSON基础概念
JSON本质上是一种文本格式,它的语法和Javascript对象字面量非常相似,但存在一定区别:JSON的键名必须用双引号包裹,字符串值也必须用双引号包裹,不支持函数、undefined等类型的数据。一个简单的JSON字符串示例如下:
// 合法的JSON字符串
const jsonStr = '{"name":"张三","age":25,"isStudent":false}';
JSON序列化:JSON.stringify()
JSON序列化指的是将Javascript对象转换为JSON字符串的过程,Javascript内置的JSON.stringify()方法可以实现这个功能。
基本用法
该方法接收三个参数,最常用的是前两个:第一个参数是需要序列化的Javascript对象,第二个参数是可选的替换器(可以是函数或数组),第三个参数是可选的分隔符(用于控制缩进)。
// 定义一个Javascript对象
const user = {
name: "李四",
age: 30,
hobbies: ["篮球", "阅读"],
address: {
city: "北京",
street: "朝阳路"
}
};
// 基本序列化,不传递第二、第三个参数
const basicJsonStr = JSON.stringify(user);
console.log(basicJsonStr);
// 输出:{"name":"李四","age":30,"hobbies":["篮球","阅读"],"address":{"city":"北京","street":"朝阳路"}}
// 传递第三个参数设置缩进,方便阅读
const formattedJsonStr = JSON.stringify(user, null, 2);
console.log(formattedJsonStr);
// 输出带2个空格缩进的格式化JSON字符串
替换器参数的使用
当第二个参数是数组时,只会序列化数组中指定的属性;当第二个参数是函数时,可以对每个键值对进行处理后再序列化。
const user = {
name: "李四",
age: 30,
password: "123456"
};
// 数组作为替换器,只保留name和age属性
const filteredJsonStr = JSON.stringify(user, ["name", "age"]);
console.log(filteredJsonStr); // 输出:{"name":"李四","age":30}
// 函数作为替换器,对age属性做处理
const processedJsonStr = JSON.stringify(user, (key, value) => {
if (key === "age") {
return value + 1; // 年龄加1
}
if (key === "password") {
return undefined; // 过滤掉password属性
}
return value;
});
console.log(processedJsonStr); // 输出:{"name":"李四","age":31}
序列化注意事项
- 如果对象中包含函数、undefined、Symbol类型的值,这些值会被忽略(在数组中会转为null)。
- 如果对象包含
toJSON方法,序列化时会调用该方法,返回的值作为序列化的结果。 - 不支持序列化循环引用的对象,否则会抛出错误。
JSON解析:JSON.parse()
JSON解析指的是将JSON字符串转换为Javascript对象的过程,Javascript内置的JSON.parse()方法可以实现这个功能。
基本用法
该方法接收两个参数,第一个参数是需要解析的JSON字符串,第二个参数是可选的还原函数,可以对解析后的每个键值对进行处理。
// 合法的JSON字符串
const jsonStr = '{"name":"王五","age":28,"birthDate":"2000-01-01"}';
// 基本解析
const userObj = JSON.parse(jsonStr);
console.log(userObj.name); // 输出:王五
console.log(userObj.age); // 输出:28
// 使用还原函数,将birthDate字符串转为Date对象
const userObjWithDate = JSON.parse(jsonStr, (key, value) => {
if (key === "birthDate") {
return new Date(value);
}
return value;
});
console.log(userObjWithDate.birthDate instanceof Date); // 输出:true
解析注意事项
- 传入的字符串必须是合法的JSON格式,否则会抛出语法错误,建议使用try...catch包裹解析逻辑处理异常。
- JSON字符串中的键名和字符串值必须使用双引号,单引号会导致解析失败。
const invalidJsonStr = "{'name':'赵六'}"; // 使用单引号,非法JSON
try {
const obj = JSON.parse(invalidJsonStr);
} catch (e) {
console.error("JSON解析失败:", e.message); // 输出错误信息
}
常见使用场景
| 场景 | 操作 |
|---|---|
| 前后端数据交互 | 前端将请求参数用JSON.stringify()序列化后发送,后端返回JSON字符串后前端用JSON.parse()解析 |
| 本地存储数据 | 将数据序列化后存入localStorage,读取时用JSON.parse()还原为对象 |
| 深拷贝简单对象 | 通过JSON.parse(JSON.stringify(obj))实现简单对象的深拷贝(无法拷贝函数、undefined等) |
总结
Javascript操作JSON的序列化和解析主要通过内置的JSON.stringify()和JSON.parse()两个方法实现,前者负责将JS对象转为JSON字符串,后者负责将JSON字符串转为JS对象。使用时需要注意两者的参数配置、适用场景和潜在的异常问题,结合具体需求合理使用替换器和还原函数,可以更灵活地处理JSON数据。
JSONJSON_parseJSON_stringify序列化解析修改时间:2026-06-19 13:27:15