将 JSON 字符串 转换为 JavaScript 对象

JSON.parse 方法用于将 JSON 字符串 转换为 JavaScript 对象。它支持一个可选的 reviver 函数,用于在返回对象之前对其进行转换。

示例:基本用法

const jsonString = '{"name": "Alice", "age": 25}';
const obj = JSON.parse(jsonString);
console.log(obj.name); // 输出: Alice
console.log(obj.age); // 输出: 25

使用 reviver 参数

reviver 是一个函数,可对解析后的对象进行自定义处理。例如,将日期字符串转换为 Date 对象。

const jsonString = '{"name": "Alice", "birthDate": "2000-01-01"}';
const obj = JSON.parse(jsonString, (key, value) => {
   if (key === "birthDate") {
       return new Date(value);
   }
   return value;
});
console.log(obj.birthDate instanceof Date); // 输出: true

注意事项

语法错误: 如果 JSON 字符串格式不正确(如多余的逗号),会抛出 SyntaxError。

不支持函数: JSON 不允许包含函数。如果需要,可以将函数存储为字符串并通过 eval 转换,但这通常不推荐。

// 错误示例:多余的逗号会导致解析失败
JSON.parse('{"name": "Alice", "age": 25, }'); // 抛出 SyntaxError

总结

JSON.parse 是解析 JSON 数据的核心工具,适用于从服务器接收数据并将其转换为 JavaScript 对象。通过 reviver 参数,还可以实现更灵活的数据处理。

将 JavaScript 对象 转换为 JSON 字符串

在JavaScript中,将对象转换为JSON字符串主要使用 JSON.stringify() 方法。以下是详细用法:

基本用法

const obj = {
  name: "张三",
  age: 25,
  city: "北京"
};

const jsonString = JSON.stringify(obj);
console.log(jsonString);
// 输出: '{"name":"张三","age":25,"city":"北京"}'

高级用法

1. 带缩进格式(美化输出)

const obj = { name: "李四", age: 30, hobbies: ["读书", "运动"] };

// 使用空格缩进
const prettyJson = JSON.stringify(obj, null, 2);
console.log(prettyJson);
// 输出:
// {
//   "name": "李四",
//   "age": 30,
//   "hobbies": [
//     "读书",
//     "运动"
//   ]
// }

// 使用制表符缩进
const tabbedJson = JSON.stringify(obj, null, '\t');

2. 使用替换器函数

const obj = {
  name: "王五",
  age: 28,
  password: "secret123", // 敏感信息,不序列化
  createdAt: new Date()
};

const jsonString = JSON.stringify(obj, (key, value) => {
  if (key === 'password') return undefined; // 过滤密码
  if (value instanceof Date) return value.toISOString(); // 转换日期
  return value;
});

console.log(jsonString);
// 输出: '{"name":"王五","age":28,"createdAt":"2023-10-01T12:00:00.000Z"}'

3. 使用替换器数组(只序列化指定属性)

const obj = {
  name: "赵六",
  age: 35,
  email: "zhao@example.com",
  internalId: "12345"
};

// 只序列化 name 和 age 属性
const jsonString = JSON.stringify(obj, ['name', 'age']);
console.log(jsonString);
// 输出: '{"name":"赵六","age":35}'

处理特殊情况

1. 处理循环引用

const obj = { name: "测试" };
obj.self = obj; // 循环引用

try {
  JSON.stringify(obj);
} catch (error) {
  console.error("循环引用错误:", error.message);
}

// 解决方案:使用替换器函数
const safeStringify = (obj) => {
  const seen = new WeakSet();
  return JSON.stringify(obj, (key, value) => {
    if (typeof value === "object" && value !== null) {
      if (seen.has(value)) return "[Circular]";
      seen.add(value);
    }
    return value;
  });
};

2. 自定义 toJSON 方法

const person = {
  name: "钱七",
  birthDate: new Date('1990-01-01'),
  toJSON() {
    return {
      name: this.name,
      age: new Date().getFullYear() - this.birthDate.getFullYear(),
      birthYear: this.birthDate.getFullYear()
    };
  }
};

console.log(JSON.stringify(person));
// 输出: '{"name":"钱七","age":33,"birthYear":1990}'

实用工具函数

// 安全的 JSON 序列化,处理错误和循环引用
function safeStringify(obj, space = 2) {
  const seen = new WeakSet();
  
  return JSON.stringify(obj, (key, value) => {
    if (typeof value === "object" && value !== null) {
      if (seen.has(value)) return "[Circular Reference]";
      seen.add(value);
    }
    
    // 处理 undefined、函数等
    if (typeof value === 'function') return "[Function]";
    if (typeof value === 'undefined') return null;
    
    return value;
  }, space);
}

// 使用示例
const complexObj = {
  name: "测试对象",
  fn: function() { console.log('hello'); },
  nested: { data: 'nested' }
};
complexObj.self = complexObj;

console.log(safeStringify(complexObj));

注意事项

  1. undefined、函数、Symbol 在序列化时会被忽略
  2. Date 对象 会被转换为 ISO 字符串
  3. NaN 和 Infinity 会被转换为 null
  4. 循环引用 会抛出错误,需要特殊处理

JSON.stringify() 是 JavaScript 中处理对象序列化的标准方法,适用于大多数场景的数据转换需求。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐