Nodejs 有什么简单的方法控制指定的property不出现在JSON.stringify里面
Nodejs 有什么简单的方法控制指定的property不出现在JSON.stringify里面
对象有点交叉引用,所以需要屏蔽一下,才能转换。 所以看有什么简单的办法,把parent这样的字段给屏蔽掉。
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字符串中,选择哪种方法取决于你的具体需求和对象结构。
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的方法