Skip to content

从JSON对象中序列化特定属性

JSON.stringify()的默认行为是从给定对象中提取所有可序列化的属性。然而,有许多情况下,你可能只想从对象中选择特定的键。这个问题可以通过JSON.stringify()的第二个参数来处理,可以传递一个键的数组或一个替换函数。

键的数组

键的数组允许你选择要包含在对象的字符串化版本中的特定键。当你知道所需序列化对象的确切形状时,这特别有用。

const user = {
  id: 1234,
  username: 'johnsmith',
  name: 'John Smith',
  age: 39
};

JSON.stringify(user, ['username', 'name']);
// '{ "username": "johnsmith", "name": "John Smith" }'

替换函数

替换函数比键的数组更灵活,它接受键和值作为参数。除了用它来包含或排除键之外,它还可以在对象的字符串化表示中改变每个键的值,非常有用。为了让一个键包含在输出中,替换函数必须返回一个可序列化的值(字符串、数字、布尔值、null或对象)。

class Point {
  constructor (x, y) {
    this.x = x;
    this. y = y;
  }
}

const target = {
  id: 1234,
  location: new Point(10, 20),
  name: 'Delivery point',
};

JSON.stringify(target, (key, value) => {
  // 排除id
  if (key === 'id') return undefined;
  // 将location转换为坐标数组
  if (value instanceof Point) return [value.x, value.y];
  // 返回其他属性(例如name)不做修改
  return value;
});
// '{ "location": [10, 20], "name": "Delivery point" }'