JSON.stringify () 'dan çıktıdaki belirli değerleri gizle


87

Bazı alanların json dizesine dahil edilmemesi mümkün müdür?

İşte bazı sözde kod

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

PrivateProperty1 ve privateproperty2'nin json dizesinde görünmesini engellemek istiyorum

Ben de stringify ikame işlevini kullanabilirim diye düşündüm.

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

ve stringify'da

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

Ama jsonString'de bunu hala olarak görüyorum

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

İçlerinde özel mülkler olmadan dizeyi istiyorum.



4
"yok" döndürmek yerine tanımsız döndür.
JoeyRobichaud

1
Bu soruyu gördüm ve mevcut uygulamamı etkilediği için özellikleri silmek istemiyorum. Nesneyi bir dosyaya kaydetmeye çalışıyorum ve uygulamada hala canlı nesne var, bu nedenle bir özelliği silmek onu işe yaramaz hale getirecek. Diğer bir seçenek de, nesneyi klonlayabilir, alanları silebilir ve ardından klon nesnesini dizgeleştirebilirim.
Nilesh

1
Hey Joe, bu harikaydı. Tanımlanmamış hile yaptı. Teşekkürler. Soruyu güncelleyeceğim
Nilesh

Yanıtlar:


102

Mozilla dokümanlar dönüş söylemek undefined(yerine "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));

İşte o rotaya gitmeye karar vermeniz durumunda (yorumunuza göre) bir çoğaltma yöntemi.

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

DÜZENLE - Alt işlevdeki işlev tuşunu kafa karıştırıcı olmaması için değiştirdim.


34

Başka bir iyi çözüm: (alt çizgi gerektirir)

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

Bu çözümün yararı, x üzerinde JSON.stringify'ı çağıran herhangi birinin doğru sonuçlara sahip olmasıdır - JSON.stringify çağrılarını tek tek değiştirmeniz gerekmez.

Alt çizgi olmayan sürüm:

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

Bu yaklaşıma oy veriyorum çünkü onu daha zarif buluyorum ..
Romeo Sierra

18

Object içinden defineProperty yerel işlevini kullanabilirsiniz :

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

12
Bu yanıt işe yarar çünkü enumerablebu özellik tanımlayıcısının değeri yanlıştır.
Soul_Master

Not: Veri bir diziyse ve biri onun n'inci öğesini gizlemek istiyorsa işe yaramaz.
Alex Szücs

3

Yapmanın daha kolay yolu.

  1. Bir değişken oluşturun ve boş bir dizi atayın. Bu, nesneyi dizinin prototipi yapar.
  2. Bu nesneye sayısal olmayan anahtarlar ekleyin.
  3. JSON.stringify kullanarak bu nesneyi seri hale getirin
  4. Bu nesneden hiçbir şeyin serileştirilmediğini göreceksiniz.

~~~

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


2

Object.create, defineProperty çözümüne yakın olan başka bir çözümdür (özellikler aynı şekilde tanımlanır), ancak bu şekilde ortaya çıkacak özellikleri baştan tanımlarsınız. Bu şekilde, özellik enumerabledeğerini true (varsayılan olarak false) olarak ayarlayarak yalnızca istediğiniz özellikleri açığa çıkarabilirsiniz , JSON.stringify, numaralandırılamayan özellikleri yok sayıyor, dezavantajı, for-in kullanılırken bu özelliğin de gizlenmesidir. nesne üzerinde döngü veya Object.keys gibi işlevler.

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

2

İçin not Miroslaw Dylag 'ın cevabı : tanımlı özelliğin kendi özellik olmalıdır. Aksi takdirde başarısız olur.

Çalışmıyor:

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)

İşler:

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)

1

Bunun zaten yanıtlanmış bir soru olduğunu biliyorum, ancak başlatılmış nesneleri kullanırken bir şeyler eklemek istiyorum.

Bir işlev kullanarak atarsanız, JSON.stringify () sonucuna dahil edilmeyecektir.

Değere erişmek için, onu bir işlev olarak da adlandırın ve ile bitirin. ()

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

Ayrıca, uygulanmış nesnelerde olmasa bile konsept ile oynayabilirsiniz.


Bu, yalnızca o özelliğin değerini ayarlamanız gerekmediğinde çalışır.
Gabriel C

1

Bu eski bir soru, ancak bununla başa çıkmanın çok daha basit bir yolu olduğu için bir cevap ekliyorum. JSON'da çıktısını almak istediğiniz dizeler dizisini iletin.

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


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

0

ES2017 ile bunu kolayca yapabilirsiniz

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

Buraya privateProperty1ve privateProperty2atanır exc1ve exc2buna göre. Kalanlar fooyeni oluşturulan değişkene atanır



0

İşte Internet Explorer desteği olmasa da başka bir yaklaşım.

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

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

0

İşte yayılma operatörü ile yaklaşımım (...):

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

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

0

Delp'in Konu Başlığına abone oluyorum https://stackoverflow.com/a/62457745/14491024 Bu konu yardımcı oldu

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

Bu şekilde ihtiyacım olan özellikleri seçebilirim:

    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(""));
        }
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.