Sembunyikan nilai tertentu dalam output dari JSON.stringify ()

87

Apakah mungkin untuk mengecualikan bidang tertentu agar tidak disertakan dalam string json?

Berikut adalah beberapa kode palsu

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

Saya ingin mengecualikan privateProperty1 dan privateproperty2 agar tidak muncul di string json

Jadi saya pikir, saya bisa menggunakan fungsi pengganti stringify

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

dan di stringify

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

Tapi di jsonString saya masih melihatnya sebagai

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

Saya ingin string tanpa properti pribadi di dalamnya.

Nilesh
sumber
Kemungkinan duplikat: stackoverflow.com/questions/208105/…
Jared Farrish
4
bukannya mengembalikan "tidak ada", kembalikan tidak ditentukan.
JoeyRobichaud
1
Saya melihat pertanyaan itu dan saya tidak ingin menghapus properti karena ini memengaruhi aplikasi saya saat ini. Saya mencoba menyimpan objek ke file dan aplikasi masih memiliki objek langsung sehingga menghapus properti akan membuatnya tidak berguna. Pilihan lainnya adalah saya bisa mengkloning objek, menghapus field dan kemudian merangkai objek kloning.
Nilesh
1
Hei Joe, bagus sekali. Yang tidak terdefinisi berhasil. Terima kasih. Saya akan memperbarui pertanyaan
Nilesh

Jawaban:

102

Dokumen Mozilla mengatakan untuk mengembalikan undefined(bukan "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));

Berikut adalah metode duplikasi, jika Anda memutuskan untuk pergi ke rute itu (sesuai komentar Anda).

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'])));

EDIT - Saya mengubah tombol fungsi di fungsi bawah agar tidak membingungkan.

Jared Farrish
sumber
34

Solusi bagus lainnya: (membutuhkan garis bawah)

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

Manfaat dari solusi ini adalah siapa pun yang memanggil JSON.stringify pada x akan mendapatkan hasil yang benar - Anda tidak perlu mengubah panggilan JSON.stringify satu per satu.

Versi non-garis bawah:

x.toJSON = function () {
    var result = {};
    for (var x in this) {
        if (x !== "privateProperty1" && x !== "privateProperty2") {
            result[x] = this[x];
        }
    }
    return result;
};
Curtis Yallop
sumber
Saya memilih pendekatan ini karena menurut saya lebih elegan ..
Romeo Sierra
18

Anda dapat menggunakan fungsi native defineProperty dari Object:

var data = {a: 10};
Object.defineProperty(data, 'transient', {value: 'static', writable: true});
data.transient = 'dasda';
console.log(JSON.stringify(data)); //{"a":10}
Miroslaw Dylag
sumber
12
Jawaban ini berfungsi karena enumerablenilai deskriptor properti ini salah.
Soul_Master
Catatan: Ini tidak berfungsi jika data adalah sebuah array dan seseorang ingin menyembunyikan elemen ke-n darinya.
Alex Szücs
3

Cara yang lebih mudah dilakukan.

  1. Buat variabel dan tetapkan array kosong. Ini membuat objek menjadi prototipe array.
  2. Tambahkan kunci non numerik pada objek ini.
  3. Serialisasi objek ini menggunakan JSON.stringify
  4. Anda akan melihat bahwa tidak ada serialisasi dari objek ini.

~~~

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

Markandey Singh
sumber
2

Object.create adalah solusi lain yang dekat dengan solusi defineProperty (properti didefinisikan dengan cara yang sama) tetapi dengan cara ini Anda menentukan properti yang akan diekspos dari awal. Dengan cara ini Anda hanya dapat mengekspos properti yang Anda inginkan dengan menyetel nilai properti enumerablemenjadi benar (salah secara default), JSON.stringify mengabaikan properti non-enumerable, sisi negatifnya adalah properti ini juga akan disembunyikan saat menggunakan for-in loop pada objek atau fungsi seperti Object.keys.

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"}"
Matan Hafuta
sumber
2

Catatan untuk Miroslaw Dylag 's Jawabannya : Properti didefinisikan harus properti sendiri. Kalau tidak, itu akan gagal.

Tidak bekerja:

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)

Pekerjaan:

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)
Audi Nugraha
sumber
1

Saya tahu ini sudah menjadi pertanyaan yang dijawab, tapi saya ingin menambahkan sesuatu saat menggunakan objek instatiated.

Jika Anda menetapkannya menggunakan fungsi, itu tidak akan disertakan pada hasil JSON.stringify ().

Untuk mengakses nilai, panggil sebagai fungsi juga, diakhiri dengan ()

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

Anda juga dapat bermain-main dengan konsep bahkan saat tidak pada objek yang tidak stabil.

dragonjet
sumber
Ini hanya berfungsi jika Anda tidak perlu menyetel nilai properti itu.
Gabriel C
1

Ini adalah pertanyaan lama, tetapi saya menambahkan jawaban karena ada cara yang jauh lebih sederhana untuk menangani ini. Teruskan larik string yang ingin Anda keluarkan di JSON.

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

JSON.stringify(x, ["x", "y", "divID"]);

// This will output only x y and divID
// {"x":0,"y":0,"divID":"xyz"}

delp
sumber
0
abstract class Hideable {
    public hidden = [];
    public toJSON() {
        var result = {};
        for (var x in this) {
            if(x == "hidden") continue;
            if (this.hidden.indexOf(x) === -1) {
                result[x] = this[x];
            }
        }
        return result;
    };
}
Carlos Arturo Alaniz
sumber
0

Anda dapat melakukannya dengan mudah dengan ES2017

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

Di sini privateProperty1dan privateProperty2ditugaskan ke exc1dan exc2sesuai. Sisanya ditugaskan ke foovariabel yang baru dibuat

peja
sumber
0

Berikut pendekatan lain, meskipun tanpa dukungan Internet Explorer.

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

const jsonString = JSON.stringify(x, excludePrivateProperties);
Mike Nikles
sumber
0

Inilah pendekatan saya dengan operator penyebaran (...):

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

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

Saya berlangganan Topik delp https://stackoverflow.com/a/62457745/14491024 Topik ini membantu kode saya

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

Dengan cara itu saya dapat memilih atribut yang saya butuhkan:

    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(""));
        }
    }
MikeRyz
sumber