我有一个带有toJSON方法的对象:
const v = {
foo: 'zoom1',
bar: 'zoom2',
toJSON(){
return {foo: this.foo}
}
}
当我打电话给JSON.stringify(v)
时,我会得到{foo:'zoom1'}
-我的问题是-是否有一种方法可以根据谁在调用JSON.stringify()来对其进行不同的字符串化,例如,如果我想要:
{bar: 'zoom2'}
代替?不知道,也许有一个很好的设计模式。
答案 0 :(得分:3)
实际上,您可以使用parameter函数的替换者stringify:
一个用于改变字符串化过程行为的函数,或者是一个String和Number对象数组,它们用作白名单,用于选择/过滤要包含在JSON字符串中的值对象的属性。如果此值为null或未提供,则对象的所有属性都将包含在结果JSON字符串中。
示例:
>>> None = 3
File "<stdin>", line 1
SyntaxError: cannot assign to None
答案 1 :(得分:2)
有两种不推荐使用的方法,使您可以确定谁调用了特定函数:arguments.callee和function.caller。
但是,我建议您不要定义尝试序列化的对象或猴子修补内置序列化功能,而应该定义帮助程序序列化方法,这些方法将以不同的方式返回对象(例如,不同的视图相同的数据)
如果您想返回该对象的两个不同视图,则{@ {1}}和flat
如下所示:
deep
如果要引入一些函数组成,还可以创建不同的方法来表示传递到同一序列化函数中的数据。
使用相同的示例,您可能会有类似的内容:
const myData = {}
const flatSerializer = (data) => {}
const deepSerializer = (data) => {}
const flatString = flatSerializer(myData)
const deepString = deepSerializer(myData)
答案 2 :(得分:2)
一种选择是使用replacer
的{{1}}参数。该函数调用时在对象中将每个属性的键和值进行字符串化,如果从中返回stringify
,则该属性将从字符串化结果中排除。
您可能在库中有一堆替换函数,对于要排除的一组属性,每个替换函数都返回undefined,即从本质上创建对象的不同“视图”。然后,调用者在调用stringify时选择它想要的替换者。
答案 3 :(得分:0)
还没有尝试过,但是我认为答案是自定义替换器,就像这样:
const result = JSON.stringify(v, (val) => {
if(val instanceof whatever){
return {bar: val.bar};
}
return val;
});