JavaScript 数据类型:深入理解 JSON 格式与序列化

JavaScript 数据类型:深入理解 JSON 格式与序列化

ru.javascript.info Современный учебник JavaScript ru.javascript.info 项目地址: https://gitcode.com/gh_mirrors/ru/ru.javascript.info

什么是 JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于 JavaScript 对象语法,但独立于语言。几乎所有现代编程语言都支持 JSON 格式,这使得它成为前后端数据交互的理想选择。

JSON 的核心优势在于:

  • 易于人类阅读和编写
  • 易于机器解析和生成
  • 完全独立于语言的文本格式

基本序列化:JSON.stringify

JSON.stringify 方法用于将 JavaScript 值转换为 JSON 字符串:

let user = {
  name: "张三",
  age: 28,
  isAdmin: true,
  skills: ["JavaScript", "HTML", "CSS"]
};

let json = JSON.stringify(user);
console.log(json); 
// 输出:{"name":"张三","age":28,"isAdmin":true,"skills":["JavaScript","HTML","CSS"]}

JSON 与 JavaScript 对象的区别

  1. 字符串引号:JSON 只允许双引号,JavaScript 允许单引号和双引号
  2. 属性名引号:JSON 要求所有属性名必须用双引号括起来
  3. 数据类型:JSON 不支持函数、Symbol 和 undefined

高级序列化技巧

1. 排除特定属性

可以通过传递数组作为第二个参数来指定需要序列化的属性:

let meeting = {
  title: "技术分享会",
  participants: ["王五", "李四"],
  location: "会议室A",
  private: true
};

let json = JSON.stringify(meeting, ['title', 'participants']);
console.log(json); // 输出:{"title":"技术分享会","participants":["王五","李四"]}

2. 自定义转换函数

更灵活的方式是使用转换函数:

function replacer(key, value) {
  if (typeof value === 'string') {
    return undefined; // 过滤掉所有字符串值
  }
  return value;
}

let data = {
  name: "测试",
  age: 30,
  isValid: true
};

let json = JSON.stringify(data, replacer);
console.log(json); // 输出:{"age":30,"isValid":true}

3. 格式化输出

第三个参数用于控制缩进:

let obj = {
  name: "示例",
  data: {
    items: [1, 2, 3],
    enabled: true
  }
};

console.log(JSON.stringify(obj, null, 2));
/*
输出:
{
  "name": "示例",
  "data": {
    "items": [
      1,
      2,
      3
    ],
    "enabled": true
  }
}
*/

自定义序列化:toJSON 方法

对象可以通过实现 toJSON 方法来自定义序列化行为:

let product = {
  name: "笔记本电脑",
  price: 5999,
  stock: 10,
  toJSON() {
    return {
      name: this.name,
      price: `¥${this.price}`
    };
  }
};

console.log(JSON.stringify(product)); 
// 输出:{"name":"笔记本电脑","price":"¥5999"}

反序列化:JSON.parse

将 JSON 字符串转换回 JavaScript 对象:

let jsonStr = '{"name":"智能手机","price":2999,"inStock":true}';
let product = JSON.parse(jsonStr);
console.log(product.name); // 输出:智能手机

使用 reviver 函数

可以在解析过程中转换值:

let str = '{"title":"会议","date":"2023-05-20T10:00:00.000Z"}';

let meeting = JSON.parse(str, (key, value) => {
  if (key === 'date') return new Date(value);
  return value;
});

console.log(meeting.date.getFullYear()); // 输出:2023

常见问题与解决方案

1. 循环引用问题

当对象存在循环引用时,直接序列化会报错:

let parent = {};
let child = { parent: parent };
parent.child = child;

// 会抛出错误
// JSON.stringify(parent);

解决方案是使用自定义序列化方法排除循环引用。

2. 处理特殊对象

Date 对象会被转换为字符串,可以使用 reviver 函数在解析时转换回来。

3. 大数据量处理

对于大型对象,考虑分批处理或使用专门的流式 JSON 解析器。

实际应用场景

  1. 前后端通信:AJAX 请求和响应通常使用 JSON 格式
  2. 配置文件:许多工具和框架使用 JSON 格式的配置文件
  3. 数据存储:NoSQL 数据库如 MongoDB 使用类似 JSON 的 BSON 格式
  4. API 设计:RESTful API 通常使用 JSON 作为数据交换格式

性能考虑

  1. 序列化性能:复杂对象序列化可能耗时,特别是在频繁操作时
  2. 内存使用:大 JSON 字符串会占用较多内存
  3. 安全考虑:永远不要直接 eval JSON 字符串,总是使用 JSON.parse

JSON 作为现代 Web 开发的基础技术,掌握其原理和高级用法对于开发者至关重要。通过合理使用序列化和反序列化技巧,可以构建更健壮、高效的应用程序。

ru.javascript.info Современный учебник JavaScript ru.javascript.info 项目地址: https://gitcode.com/gh_mirrors/ru/ru.javascript.info

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翟万实Robust

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值