4

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

[{
    public: "public",
    private: "private",
    [{
        properties: {...
        },
        instance: {.....
        }
    }, {...
    }, {...
    }]
}, {...
}, {....
}]

这里最外面的数组包含 A 类的对象,它有一些公共道具,一些私有 porps,它还包含一个包含 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;
}();

现在,在对其进行字符串化(序列化)时,我只想在序列化字符串中包含公共道具和数组。

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

[{
        public: "public",
        [{
            properties: {...
            }
        }, {...
        }, {...
        }]
    }, {...
    }, {....
    }]

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

在 JSON.stringify() 的输出中引用了隐藏某些值,但它只解释了如何在单个层次结构中排除简单的数字或字符串道具,但如何在多个层次结构中排除道具?

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

4

3 回答 3

6
var result = JSON.stringify(myjson, function(key, val) {
    if (key !== "private")
        return val;
});

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

于 2012-09-17T19:18:59.443 回答
5

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

因此,如果你有一个对象“Message”具有公共和“私有”属性,则需要定义一个只返回公共属性的“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"}
于 2012-09-17T23:33:59.540 回答
2

也许有点晚了,但JSON.stringify签名接受一个replacer函数/数组。您可以根据需要定义数组白名单和函数。

MDN 文档

于 2018-05-04T18:37:18.907 回答