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

时间:2012-09-17 19:11:30

标签: javascript json serialization stringify

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

[{
    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;
}();

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

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

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

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

我提到了Hide certain values in output from JSON.stringify(),但它只解释了如何在单个层次结构中排除简单的数字或字符串道具,但是如何排除多个层次结构中的道具?

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

假设您正在编写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"}

答案 2 :(得分:2)

可能有点迟,但JSON.stringify签名接受replacer函数/数组。您可以根据需要定义阵列白名单和功能。

MDN Documentation