根据上下文不同地对对象进行字符串化

时间:2018-12-08 00:25:21

标签: javascript node.js json

我有一个带有toJSON方法的对象:

const v = {
  foo: 'zoom1',
  bar: 'zoom2',
  toJSON(){
     return {foo: this.foo}
  }
}

当我打电话给JSON.stringify(v)时,我会得到{foo:'zoom1'}-我的问题是-是否有一种方法可以根据谁在调用JSON.stringify()来对其进行不同的字符串化,例如,如果我想要:

{bar: 'zoom2'}
代替?不知道,也许有一个很好的设计模式。

4 个答案:

答案 0 :(得分:3)

实际上,您可以使用parameter函数的替换者stringify

  

一个用于改变字符串化过程行为的函数,或者是一个String和Number对象数组,它们用作白名单,用于选择/过滤要包含在JSON字符串中的值对象的属性。如果此值为null或未提供,则对象的所有属性都将包含在结果JSON字符串中。

示例:

>>> None = 3
 File "<stdin>", line 1
SyntaxError: cannot assign to None

答案 1 :(得分:2)

有两种不推荐使用的方法,使您可以确定谁调用了特定函数:arguments.calleefunction.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时选择它想要的替换者。

Reference

答案 3 :(得分:0)

还没有尝试过,但是我认为答案是自定义替换器,就像这样:

const result = JSON.stringify(v, (val) => {

   if(val instanceof whatever){
      return {bar: val.bar};
   }

   return val;

});