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

时间:2011-02-06 00:01:17

标签: javascript json

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

这是一些伪代码

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

我想排除privateProperty1和privateproperty2出现在json字符串中

所以我想,我可以使用stringify替换器功能

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

并在stringify中

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

但在jsonString中我仍然将其视为

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

我想要没有privateproperties的字符串。

14 个答案:

答案 0 :(得分:83)

Mozilla docs说要返回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'])));

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

答案 1 :(得分:21)

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

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;
};

答案 2 :(得分:14)

您可以使用Object:

中的本机函数 defineProperty
var data = {a: 10};
Object.defineProperty(data, 'transient', {value: 'static', writable: true});
data.transient = 'dasda';
console.log(JSON.stringify(data)); //{"a":10}

答案 3 :(得分:3)

更容易的方法。

  1. 创建变量并指定一个空数组。这使得对象成为数组的原型。
  2. 在此对象上添加非数字键。
  3. 使用JSON.stringify
  4. 序列化此对象
  5. 您将看到此对象没有任何序列化。
  6. ~~~

    var myobject={
      a:10,
      b:[]
    };
    
    myobject.b.hidden1 = 'hiddenValue1';
    myobject.b.hidden2 = 'hiddenValue2';
    
    //output of stringify 
    //{
    //    "a": 10,
    //    "b": []
    //}
    

    ~~~

    http://www.markandey.com/2015/07/how-to-hide-few-keys-from-being-being.html

答案 4 :(得分:2)

Object.create是另一个接近defineProperty解决方案的解决方案(属性以相同的方式定义),但是通过这种方式,您可以定义从头开始公开的属性。 通过这种方式,您可以通过将属性enumerable值设置为true(默认为false)来仅公开所需的属性,JSON.stringify忽略不可枚举的属性,缺点是此属性也将被隐藏在对象或函数(如Object.keys。)上使用for-in循环时。

var x = Object.create(null, {
    x: {value:0, enumerable: true}, 
    y:{value: 0, enumerable: true}, 
    divID: {value: 'xyz', enumerable: true}, 
    privateProperty1: {value: 'foo'}, 
    privateProperty2: {value: 'bar'}
});
JSON.stringify(x)
//"{"x":0,"y":0,"divID":"xyz"}"

答案 5 :(得分:1)

Miroslaw Dylag' s answer的注意事项:已定义的属性应为其自己的属性。否则就会失败。

不能工作:

class Foo {
}
Object.defineProperty(Foo.prototype, 'bar', { value: 'bar', writable: true });

const foo = new Foo();
foo.bar = 'baz';
alert(JSON.stringify(foo).indexOf('bar') === -1); // false (found)

使用:

class Foo {
  constructor() {
    Object.defineProperty(this, 'bar', { value: 'bar', writable: true });
  }
}

const foo = new Foo();
foo.bar = 'baz';
alert(JSON.stringify(foo).indexOf('bar') === -1); // true (not found)

答案 6 :(得分:1)

这是一个古老的问题,但是我要添加一个答案,因为有一个更简单的方法可以解决这个问题。传递要在JSON中输出的字符串数组。

import numpy as np

答案 7 :(得分:0)

我知道这已经是一个已回答的问题,但我想在使用实例化对象时添加一些内容。

如果使用函数指定它,它将不会包含在JSON.stringify()结果中。

要访问该值,请将其作为函数调用,以()

结尾
var MyClass = function(){
    this.visibleProperty1 = "sample1";
    this.hiddenProperty1 = function(){ return "sample2" };
}

MyClass.prototype.assignAnother = function(){
    this.visibleProperty2 = "sample3";
    this.visibleProperty3 = "sample4";
    this.hiddenProperty2 = function(){ return "sample5" };
}

var newObj = new MyClass();
console.log( JSON.stringify(newObj) );
// {"visibleProperty1":"sample1"}

newObj.assignAnother();
console.log( JSON.stringify(newObj) );
// {"visibleProperty1":"sample1","visibleProperty2":"sample3","visibleProperty3":"sample4"}

console.log( newObj.visibleProperty2 ); // sample3
console.log( newObj.hiddenProperty1() ); // sample2
console.log( newObj.hiddenProperty2() ); // sample5

即使没有在实例化的对象上,你也可以使用这个概念。

答案 8 :(得分:0)

print my['data']['tasks']

答案 9 :(得分:0)

您可以使用ES2017轻松完成

let {privateProperty1:exc1, privateProperty2:exc2, ...foo} = {
    x:0,
    y:0,
    divID:"xyz",
    privateProperty1: 'foo',
    privateProperty2: 'bar'
}

此处privateProperty1privateProperty2被分别分配给exc1exc2。其余的分配给foo新创建的变量

答案 10 :(得分:0)

我已经使用基于我编写的小型库的JSON解决方案,以便在运行时进行https://stackoverflow.com/a/55917109/4236151的输入

答案 11 :(得分:0)

这是另一种方法,尽管没有Internet Explorer支持。

const privateProperties = ["privateProperty1", "privateProperty2"];
const excludePrivateProperties = (key, value) => privateProperties.includes(key) ? undefined : value;

const jsonString = JSON.stringify(x, excludePrivateProperties);

答案 12 :(得分:0)

这是我使用点差运算符(...)的方法:

const obj = { name:"hello", age:42, id:"3942" };
const objWithoutId = { ...o, id: undefined }

const jsonWithoutId = JSON.stringify({...o, id:undefined});

答案 13 :(得分:0)

我订阅了 delp 的主题 https://stackoverflow.com/a/62457745/14491024 这个话题对我的代码有帮助

 JSON.stringify(GetMyContent[i], ["mdlPageName", "mdlAligen", "mdlOrderNumberHorizontal", "mdlPageId", "mdlOrderNumberVertical"])

这样我就可以选择我需要的属性:

    if (GetMyContent[i].mdlAligen == "Left") {

        var getrownum = GetMyContent[i].mdlOrderNumberHorizontal;

        if ($('.Left div.row:eq(' + (getrownum - 1) + ')').children().length > 0) {

            $('.Left div.row:eq(' + (getrownum - 1) + ')').append("<div id=" + GetMyContent[i].mdlPageId + " class=\"border border-secondary col\"  " + "data-atrrib=" + JSON.stringify(GetMyContent[i], ["mdlPageName", "mdlAligen", "mdlOrderNumberHorizontal", "mdlPageId", "mdlOrderNumberVertical"]) + ">" + GetMyContent[i].mdlPageContentHtml + buttonEDI + "</div>");
        }
        else {
            $('.Left div.row:last').html("<div id=" + GetMyContent[i].mdlPageId + " class=\"border border-secondary col\"  " + "data-atrrib=" + JSON.stringify(GetMyContent[i], ["mdlPageName", "mdlAligen", "mdlOrderNumberHorizontal", "mdlPageId", "mdlOrderNumberVertical"]) + ">" + GetMyContent[i].mdlPageContentHtml + buttonEDI + "</div>");

                $(".Left .row:last").after($('.Left .row:eq(0)').clone().html(""));
        }
    }