在JavaScript中处理JSON:数据解析与序列化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JSON简介及其在JavaScript中的作用



JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,基于JavaScript对象语法。尽管源于JavaScript,JSON已成为服务器与客户端之间传输结构化数据的通用标准,也用于存储配置和在微服务架构中交换信息。



在Node.js环境中,处理JSON是日常任务:从读取配置文件到处理REST API响应。本文将详细介绍两个关键方法——JSON.parse()和JSON.stringify(),并分析常见错误和最佳实践。



1. 解析JSON:JSON.parse()方法



JSON.parse()方法将JSON格式的字符串转换为JavaScript对象。当您从服务器、文件或外部源接收数据时,需要使用此方法。



基本语法



const jsonString = '{"name": "安娜", "age": 30, "isStudent": false}';const user = JSON.parse(jsonString);console.log(user.name); // "安娜"console.log(user.age);  // 30


高级用法:reviver函数



JSON.parse()的第二个参数可以接受一个转换函数(reviver),允许在解析过程中修改值。这对于将字符串日期转换为Date对象或验证数据非常有用。



const jsonData = '{"date": "2024-01-15T10:30:00.000Z", "value": 42}';const parsed = JSON.parse(jsonData, (key, value) => {  if (key === 'date') {    return new Date(value);  }  return value;});console.log(parsed.date instanceof Date); // trueconsole.log(parsed.date.toLocaleDateString()); // "2024/01/15"


解析错误处理



无效的JSON会抛出SyntaxError异常。始终将JSON.parse()调用包裹在try...catch块中:



function safeParse(jsonString) {  try {    return { data: JSON.parse(jsonString), error: null };  } catch (error) {    console.error('JSON解析错误:', error.message);    return { data: null, error: error.message };  }}

const result = safeParse('{"name": "错误"}');console.log(result.data.name); // "错误"


2. 序列化为JSON:JSON.stringify()方法



JSON.stringify()方法执行相反的任务——将JavaScript对象转换为JSON字符串。这用于向服务器发送数据、保存状态或记录日志。



基本语法



const user = {  name: '伊万',  age: 25,  skills: ['JavaScript', 'Node.js']};

const jsonString = JSON.stringify(user);console.log(jsonString);// {"name":"伊万","age":25,"skills":["JavaScript","Node.js"]}


格式化参数



JSON.stringify()的第三个参数允许设置缩进,使输出更易读。这在写入文件或调试时特别有用。



const config = {  server: { port: 3000, host: 'localhost' },  database: { host: 'db.example.com', port: 5432 }};

// 紧凑输出console.log(JSON.stringify(config));

// 带2个空格缩进的易读输出console.log(JSON.stringify(config, null, 2));// {// "server": {// "port": 3000,// "host": "localhost"// },// ...// }


使用replacer过滤属性



第二个参数是一个数组或函数,用于确定结果字符串中包含哪些属性。



const user = {  id: 1,  name: '玛丽亚',  email: 'maria@example.com',  password: 'secret123',  role: 'admin'};

// 排除敏感数据const safeUser = JSON.stringify(user, ['id', 'name', 'email', 'role']);console.log(safeUser);// {"id":1,"name":"玛丽亚","email":"maria@exa

博客

书籍推荐