【问题标题】:Excluding object properties while json-stringifying array object在 json 字符串化数组对象时排除对象属性
【发布时间】:2012-09-10 01:07:39
【问题描述】:

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

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

这里最外面的数组包含 A 类的对象,它有一些公共属性,一些私有 porp,它还包含一个包含 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 的原生实现在序列化之前调用该方法。有没有办法做到这一点?

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

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

【问题讨论】:

    标签: javascript json serialization stringify


    【解决方案1】:
    var result = JSON.stringify(myjson, function(key, val) {
        if (key !== "private")
            return val;
    });
    

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

    【讨论】:

    • 但密钥并不总是“私有”,这只是一个例子,例如class A 有 json 对象“属性”,B 类也包含同名的 json 对象,现在我想包括B 类的属性,但不包括 A 类的属性,如何做到这一点?
    【解决方案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"}
    

    【讨论】:

    • 那是我的错误,纠正了语法,会尝试你的方法并回来:)
    【解决方案3】:

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

    MDN Documentation

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 2021-06-27
      相关资源
      最近更新 更多