隐藏 JSON.stringify() 输出中的某些值

2022-08-30 05:42:03

是否可以在 json 字符串中排除某些字段?

这里有一些伪代码

var x = {
    x:0,
    y:0,
    divID:"xyz",
    privateProperty1: 'foo',
    privateProperty2: 'bar'
}

我想从json字符串中排除privateProperty1和privateproperty2

所以我想,我可以使用字符串化替换器函数

function replacer(key,value)
{
    if (key=="privateProperty1") then retun "none";
    else if (key=="privateProperty2") then retun "none";
    else return value;
}

并在字符串化

var jsonString = json.stringify(x,replacer);

但是在jsonString中,我仍然将其视为

{...privateProperty1:value..., privateProperty2:value }

我想把绳子里没有。


答案 1

Mozilla文档说要返回(而不是):undefined"none"

http://jsfiddle.net/userdude/rZ5Px/

function replacer(key,value)
{
    if (key=="privateProperty1") return undefined;
    else if (key=="privateProperty2") return undefined;
    else return value;
}

var x = {
    x:0,
    y:0,
    divID:"xyz",
    privateProperty1: 'foo',
    privateProperty2: 'bar'
};

alert(JSON.stringify(x, replacer));

这是一个复制方法,以防您决定走这条路(根据您的评论)。

http://jsfiddle.net/userdude/644sJ/

function omitKeys(obj, keys)
{
    var dup = {};
    for (var key in obj) {
        if (keys.indexOf(key) == -1) {
            dup[key] = obj[key];
        }
    }
    return dup;
}

var x = {
    x:0,
    y:0,
    divID:"xyz",
    privateProperty1: 'foo',
    privateProperty2: 'bar'
};

alert(JSON.stringify(omitKeys(x, ['privateProperty1','privateProperty2'])));

编辑 - 我更改了底部函数中的功能键,以防止混淆。


答案 2

另一个好的解决方案:(需要下划线)

x.toJSON = function () {
    return _.omit(this, [ "privateProperty1", "privateProperty2" ]);
};

此解决方案的好处是,在 x 上调用 JSON.stringify 的任何人都将获得正确的结果 - 您不必单独更改 JSON.stringify 调用。

非下划线版本:

x.toJSON = function () {
    var result = {};
    for (var x in this) {
        if (x !== "privateProperty1" && x !== "privateProperty2") {
            result[x] = this[x];
        }
    }
    return result;
};