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.
javascript
json
Nilesh
sumber
sumber
Jawaban:
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.
sumber
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; };
sumber
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}
sumber
enumerable
nilai deskriptor properti ini salah.Cara yang lebih mudah dilakukan.
~~~
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
sumber
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
enumerable
menjadi 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"}"
sumber
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)
sumber
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.
sumber
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"}
sumber
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; }; }
sumber
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
privateProperty1
danprivateProperty2
ditugaskan keexc1
danexc2
sesuai. Sisanya ditugaskan kefoo
variabel yang baru dibuatsumber
Saya telah menggunakan solusi toJSON berdasarkan pustaka kecil yang telah saya tulis untuk mendapatkan Pengetikan pada Waktu Proses https://stackoverflow.com/a/55917109/4236151
sumber
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);
sumber
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});
sumber
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("")); } }
sumber