JavaScript中如何将数据转换为JSON格式
在JavaScript开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易于人阅读和编写、也易于机器解析和生成,被广泛应用于前后端数据交互、配置文件存储等场景,将JavaScript中的数据(如对象、数组、基本类型等)转换为JSON格式,是日常开发中常见的操作,本文将详细介绍JavaScript中实现数据转JSON的核心方法、注意事项及实际应用场景。
核心方法:JSON.stringify()
JavaScript原生提供了JSON对象,其中stringify()方法是专门用于将JavaScript值转换为JSON字符串的核心函数,该方法可以将对象、数组、基本类型(字符串、数字、布尔值、null)等数据序列化为符合JSON标准的字符串。
基本语法
JSON.stringify(value[, replacer[, space]])
参数说明:
value:必填,需要转换为JSON字符串的JavaScript值(通常是对象或数组)。replacer:可选,用于控制序列化过程的函数或数组。- 若为函数,则会对每个属性调用该函数,返回值将作为该属性的序列化结果;
- 若为数组,则仅序列化数组中存在的属性键名。
space:可选,用于格式化输出结果的缩进字符串或数字。- 若为数字(1-10),表示缩进的空格数;
- 若为字符串(如
"\t"、),则用该字符串作为缩进; - 若省略或为
null,则输出紧凑的单行字符串。
基本使用示例
(1)转换普通对象
const user = {
name: "张三",
age: 25,
isStudent: false,
address: null
};
const jsonString = JSON.stringify(user);
console.log(jsonString);
// 输出: {"name":"张三","age":25,"isStudent":false,"address":null}
(2)转换数组
const fruits = ["苹果", "香蕉", "橙子"]; const jsonFromArray = JSON.stringify(fruits); console.log(jsonFromArray); // 输出: ["苹果","香蕉","橙子"]
(3)转换基本类型
- 字符串:会被双引号包裹(JSON标准要求字符串必须用双引号)
const str = "Hello"; console.log(JSON.stringify(str)); // 输出: "Hello"
- 数字、布尔值、null:直接转换为对应的JSON字面量
console.log(JSON.stringify(123)); // 输出: 123 console.log(JSON.stringify(true)); // 输出: true console.log(JSON.stringify(null)); // 输出: null
- 注意:
undefined、函数、Symbol类型的值在序列化时会被忽略(或在数组中变为null,在对象中直接过滤掉)。
使用replacer控制序列化
(1)通过函数过滤或修改值
const data = {
name: "李四",
age: 30,
password: "123456", // 敏感信息,不希望序列化
hobbies: ["读书", "游泳"]
};
// 使用函数过滤掉password字段
const filteredJson = JSON.stringify(data, (key, value) => {
if (key === "password") {
return undefined; // 返回undefined则该属性不包含在结果中
}
return value;
});
console.log(filteredJson);
// 输出: {"name":"李四","age":30,"hobbies":["读书","游泳"]}
(2)通过数组指定需要序列化的属性
const user = {
id: 1,
name: "王五",
email: "wangwu@example.com",
phone: "13800138000"
};
// 仅序列化id和name
const selectedJson = JSON.stringify(user, ["id", "name"]);
console.log(selectedJson);
// 输出: {"id":1,"name":"王五"}
使用space格式化输出
const user = {
name: "赵六",
details: {
age: 28,
city: "北京"
},
hobbies: ["跑步", "游戏"]
};
// 使用数字缩进(2个空格)
const formattedJson1 = JSON.stringify(user, null, 2);
console.log(formattedJson1);
/* 输出:
{
"name": "赵六",
"details": {
"age": 28,
"city": "北京"
},
"hobbies": [
"跑步",
"游戏"
]
}
*/
// 使用字符串缩进(制表符)
const formattedJson2 = JSON.stringify(user, null, "\t");
console.log(formattedJson2);
/* 输出:
{
"name": "赵六",
"details": {
"age": 28,
"city": "北京"
},
"hobbies": [
"跑步",
"游戏"
]
}
*/
注意事项:JSON.stringify()的局限性
虽然JSON.stringify()功能强大,但在使用时需要注意以下特殊情况,避免出现非预期结果:
忽略undefined、函数和Symbol
- 对象的属性值为
undefined、函数或Symbol时,这些属性会被过滤掉,不会出现在JSON字符串中。const obj = { name: "钱七", age: undefined, sayHi: function() { console.log("Hi"); }, id: Symbol("id") }; console.log(JSON.stringify(obj)); // 输出: {"name":"钱七"}
循环引用导致报错
如果对象或数组存在循环引用(即对象的某个属性引用了自身),JSON.stringify()会直接抛出TypeError。
const obj = { name: "循环引用" };
obj.self = obj; // obj引用自身,形成循环
try {
JSON.stringify(obj);
} catch (error) {
console.error(error); // 输出: TypeError: Converting circular structure to JSON...
}
解决方案:手动处理循环引用,或使用第三方库(如flatted、circular-json)。
日期对象被转换为字符串
JSON.stringify()会将Date对象调用toISOString()方法,转换为ISO格式的字符串(而非时间戳)。
const data = {
event: "会议",
time: new Date("2023-10-01T10:00:00")
};
console.log(JSON.stringify(data));
// 输出: {"event":"会议","time":"2023-10-01T10:00:00.000Z"}
若需转换为时间戳,需手动处理:
const dataWithTimestamp = {
...data,
time: data.time.getTime() // 转换为时间戳
};
console.log(JSON.stringify(dataWithTimestamp));
// 输出: {"event":"会议","time":1696118400000}
正则表达式、Map、Set等特殊对象
正则表达式、Map、Set、WeakMap、WeakSet等对象会被转换为空对象,因为它们不属于JSON标准支持的类型。
const data = {
regex: /\d+/,
map: new Map([["key", "value"]]),
set: new Set([1, 2, 3])
};
console.log(JSON.stringify(data));
// 输出: {"regex":{},"map":{},"set":{}}
解决方案:手动将这些对象转换为可序列化的格式(如普通对象或数组)。
const serializableData = {
regex: { pattern: "\\d+" }, // 转换为普通对象
map: Array.from(data.map.entries()), // Map转数组
set: Array.from(data.set.values()) // Set转数组
};
console.log(JSON.stringify(serializableData));
// 输出: {"regex":{"pattern":"\\d+"},"map":[["key","value"]],"set":[1,2,3]}
实际应用场景
前后端数据交互
前端常通过JSON.stringify()将对象或数组转换为JSON字符串,再通过fetch、axios等库发送给后端(如POST请求的请求体)。
const userData = {
username: "admin",
password: "password123"
};
fetch("https://api.example.com/login", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(userData) // 将数据转换为JSON字符串
});
本地存储数据
localStorage和sessionStorage只能存储字符串类型的数据,若需存储对象或数组,需先用JSON.stringify()序列化,读取时再用JSON.parse()反序列化。



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