在对数组对象进行json字符串化时排除对象属性

Ank*_*kur 3 javascript serialization json stringify

嘿,我有一个像这样的数组对象

[{
    public: "public",
    private: "private",
    [{
        properties: {...
        },
        instance: {.....
        }
    }, {...
    }, {...
    }]
}, {...
}, {....
}]
Run Code Online (Sandbox Code Playgroud)

在这里,最外面的数组包含类A的对象,该对象具有一些公共道具,一些私有对象,并且还包含一个包含类B的对象的数组,该对象还包含一些公共字段和私有字段。

所以基本上这是我的等级制度

array = [A1,A2,A3,A4,....]//object of A

var A = function(){
  var Const = function(){
    this.public_prop;
    this.private_prop;
    this.list = [B1,B2,B3,B4]// objects of B
  }
 //.........
 return Const;
}();

var B = function(){

  var Const = function(){
   this.public_prop;
   this.private_prop;
  }
 //.........
 return Const;
}();
Run Code Online (Sandbox Code Playgroud)

现在在进行字符串化(序列化)时,我只想在序列化字符串中包含public prop和数组。

例如对于上述JSON表示,我想要这样的东西

[{
        public: "public",
        [{
            properties: {...
            }
        }, {...
        }, {...
        }]
    }, {...
    }, {....
    }]
Run Code Online (Sandbox Code Playgroud)

现在,我可以在每个类中创建一个函数getState(),该函数将仅返回需要进行字符串化的字段,但是我似乎无法找到一种方法来使JSON.stringify的本机实现在序列化之前调用该方法。有什么方法可以做到这一点?

我提到了在JSON.stringify()的输出中隐藏某些值,但是它仅说明了如何在单个层次结构中排除简单的数字或字符串属性,但是如何在多个层次结构中排除属性

注意:我所有的课程都遵循模块模式

小智 5

var result = JSON.stringify(myjson, function(key, val) {
    if (key !== "private")
        return val;
});
Run Code Online (Sandbox Code Playgroud)

顶部的对象示例不是有效的语法,但是应该排除名为的属性"private",这应该可以工作。


小智 5

假设您按照问题标签的建议编写 JavaScript(尽管您的示例代码看起来几乎是 c#!):您需要覆盖正在序列化的对象的“toJSON”方法,而不是“stringify”或“getState” .

因此,如果您有一个具有公共和“私有”属性的“消息”对象,则需要定义一个仅返回公共属性的“toJSON”方法,如下所示:

var Message = function() {
    this.myPrivateProperty = "Secret message";
    this.myPublicProperty = "Message for the public";

    this.toJSON = function() {
        return {
            "public": this.myPublicProperty
        };
    };
}


alert(JSON.stringify(new Message()));    // {"public":"Message for the public"}
Run Code Online (Sandbox Code Playgroud)