Nodejs 有什么简单的方法控制指定的property不出现在JSON.stringify里面

Nodejs 有什么简单的方法控制指定的property不出现在JSON.stringify里面

对象有点交叉引用,所以需要屏蔽一下,才能转换。 所以看有什么简单的办法,把parent这样的字段给屏蔽掉。

6 回复

Nodejs 有什么简单的方法控制指定的property不出现在JSON.stringify里面

在Node.js中,有时候我们希望在使用JSON.stringify()方法时,能够排除某些特定的属性。例如,在处理对象时,如果对象存在交叉引用或者某些敏感信息,我们可能不希望这些属性出现在最终生成的JSON字符串中。

示例场景

假设我们有一个对象,它包含一个循环引用或一些我们不想暴露的敏感数据:

const obj = {
    name: "John",
    age: 30,
    parent: {
        name: "Jane",
        age: 50
    }
};

如果我们直接使用JSON.stringify(obj),将会得到整个对象的JSON表示,包括parent属性。但是,如果我们希望在序列化时排除parent属性,可以采用以下几种方法。

方法一:使用 replacer 函数

JSON.stringify() 方法允许我们传递一个 replacer 函数作为第二个参数。这个函数会在每个属性被序列化之前调用,我们可以利用这个特性来决定哪些属性应该被保留或排除。

const obj = {
    name: "John",
    age: 30,
    parent: {
        name: "Jane",
        age: 50
    }
};

const result = JSON.stringify(obj, (key, value) => {
    if (key === 'parent') {
        return undefined; // 排除parent属性
    }
    return value;
});

console.log(result); // 输出: {"name":"John","age":30}

在这个例子中,我们定义了一个 replacer 函数,当键为 'parent' 时,返回 undefined,从而排除了该属性。

方法二:修改对象结构

另一种方法是在序列化之前修改对象的结构,比如创建一个新的对象,只包含我们想要的属性:

const obj = {
    name: "John",
    age: 30,
    parent: {
        name: "Jane",
        age: 50
    }
};

const filteredObj = {
    name: obj.name,
    age: obj.age
};

const result = JSON.stringify(filteredObj);

console.log(result); // 输出: {"name":"John","age":30}

这种方法更加直观,但可能在处理复杂对象时需要更多的代码。

这两种方法都可以有效地控制哪些属性不会出现在最终的JSON字符串中,选择哪种方法取决于你的具体需求和对象结构。


实现 toJSON 方法

delete 或者赋成undefined呢

/**
 * 返回安全的JSON字符串
 *
 * [@param](/user/param) {Object} data
 * [@param](/user/param) {String|Number} space
 * [@return](/user/return) {String}
 * [@api](/user/api) public
 */
var jsonStringify = function (data, space) {
  var seen = [];
  return JSON.stringify(data, function (key, val) {
    if (!val || typeof val !== 'object') {
      return val;
    }
    if (seen.indexOf(val) !== -1) {
      return '[Circular]';
    }
    seen.push(val);
    return val;
  }, space);
};

使用方法:

var a = {b: 123, c:456};
a.a = a;

// 这个会自动把a.a替换成字符串[Circular]
console.log(jsonStringify(a));
// 输出结果为:{"b":123,"c":456,"a":"[Circular]"}

// 第二个参数可以用来格式化字符串
console.log(jsonStringify(a, 2));
/* 输出结果:
{
  "b": 123,
  "c": 456,
  "a": "[Circular]"
}
*/

这个我记得有谁讲过,忘记了 mongoose里回调函数返回的数据是一个mongoose提供的model对象,该对象拥有api中model的所有方法,但是toString或者toJSON方法只会打印出数据库查出来的文本信息,而不会打印api中的model的方法

要在 JSON.stringify 中排除特定属性(如 parent),你可以使用 replacer 函数。这个函数可以接受两个参数:当前属性键和值,并返回新的值来替换原始值。通过这种方式,你可以控制哪些属性应该被排除。

示例代码

假设你有一个包含交叉引用的对象:

const obj = {
    id: 1,
    name: 'Alice',
    parent: {
        id: 2,
        name: 'Bob'
    }
};

// 使用 replacer 函数来排除 'parent' 属性
const result = JSON.stringify(obj, (key, value) => {
    if (key === 'parent') {
        return undefined; // 排除 'parent' 属性
    }
    return value;
});

console.log(result);

输出结果

{"id":1,"name":"Alice"}

在这个例子中,我们定义了一个 replacer 函数,当 key 等于 'parent' 时,返回 undefined,这样 parent 属性就会被从输出的 JSON 字符串中移除。

解释

  • replacer 函数:这是一个可选的函数参数,用于过滤和转换结果。它有两个参数:当前的键和值。如果返回 undefined,则该属性不会出现在最终的 JSON 字符串中。

  • 条件判断:在 replacer 函数内部,我们检查键是否为 'parent'。如果是,则返回 undefined 以排除该属性。

通过这种方式,你可以灵活地控制哪些属性会被包含或排除在 JSON 字符串中。

回到顶部