JSON.stringify () से आउटपुट में कुछ मान छिपाएं


86

क्या कुछ क्षेत्रों को जस स्ट्रिंग में शामिल किया जाना संभव नहीं है?

यहाँ कुछ छद्म कोड है

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

मैं PrivateProperty1 और privproperty2 को json स्ट्रिंग में प्रदर्शित होने से बाहर करना चाहता हूं

तो मैंने सोचा, मैं स्ट्रिंगर प्रतिकृति फ़ंक्शन का उपयोग कर सकता हूं

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 }

मैं उनमें निजीकरण के बिना स्ट्रिंग करना चाहूंगा।


संभावित डुप्लिकेट: stackoverflow.com/questions/208105/…
जारेड फरिश

4
बदले में "कोई नहीं" वापसी अपरिभाषित।
JoeyRobichaud

1
मैंने उस प्रश्न को देखा और मैं गुणों को हटाना नहीं चाहता क्योंकि यह मेरे वर्तमान अनुप्रयोग को प्रभावित करता है। मैं किसी फ़ाइल में ऑब्जेक्ट को सहेजने की कोशिश कर रहा हूं और एप्लिकेशन में अभी भी लाइव ऑब्जेक्ट है, इसलिए किसी संपत्ति को हटाने से यह बेकार हो जाएगा। एक अन्य विकल्प यह है कि मैं ऑब्जेक्ट को क्लोन कर सकता हूं, फ़ील्ड हटा सकता हूं और फिर क्लोन ऑब्जेक्ट को स्ट्रिंग कर सकता हूं।
निलेश

1
हे जो, वह महान था। अपराजित ने चाल चली। धन्यवाद। मैं प्रश्न को अद्यतन करूँगा
नीलेश

जवाबों:


101

मोज़िला डॉक्स वापसी के लिए कहते हैं कि 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'])));

EDIT - मैंने इसे सुरक्षित रखने के लिए फ़ंक्शन फ़ंक्शन को बॉटम फ़ंक्शन में बदल दिया।


33

एक और अच्छा समाधान: (अंडरस्कोर की आवश्यकता है)

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

इस समाधान का लाभ यह है कि किसी को भी JSON.stringify पर x कॉल करने के सही परिणाम होंगे - आपको व्यक्तिगत रूप से JSON.stringify कॉल को बदलना नहीं है।

गैर-अंडरस्कोर संस्करण:

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

मैं इस दृष्टिकोण के लिए वोट देता हूं क्योंकि मुझे यह अधिक सुरुचिपूर्ण लगता है ..
रोमियो सिएरा

18

आप ऑब्जेक्ट से मूल फ़ंक्शन डिफाइनप्रोपर्टी का उपयोग कर सकते हैं :

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

12
यह उत्तर काम करता है क्योंकि enumerableइस संपत्ति के विवरणकर्ता का मूल्य गलत है।
आत्मा_मास्टर

नोट: यह काम नहीं करता है यदि डेटा एक सरणी है और कोई इसका n-th तत्व छिपाना चाहता है।
एलेक्स ज़ुक्स

3

आसान तरीका है।

  1. एक वैरिएबल बनाएं और एक खाली सरणी असाइन करें। यह ऑब्जेक्ट को सरणी का प्रोटोटाइप बनाता है।
  2. इस ऑब्जेक्ट पर गैर संख्यात्मक कुंजियाँ जोड़ें।
  3. JSON.stringify का उपयोग करके इस ऑब्जेक्ट को सीरियल करें
  4. आप देखेंगे कि इस वस्तु से कुछ भी अनुक्रमित नहीं है।

~~~

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 एक और समाधान है जो डिफाइनप्रोपर्टी सॉल्यूशन (गुणों को उसी तरह परिभाषित किया गया है) के करीब है, लेकिन इस तरह आप शुरू से ही एक्सपोज़ होने के लिए गुणों को परिभाषित करते हैं। इस तरह आप केवल उन संपत्तियों को उजागर कर सकते हैं, जिन्हें आप संपत्ति के enumerableमूल्य को सही (डिफ़ॉल्ट रूप से गलत) पर सेट करके चाहते हैं , JSON.stringify गैर-संवेदी गुणों की अनदेखी कर रहा है, नकारात्मक पक्ष यह है कि फॉर-इन का उपयोग करते समय यह संपत्ति भी छिपाई जाएगी ऑब्जेक्ट पर ऑब्जेक्ट या फ़ंक्शंस जैसे 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"}"

2

मिरोस्लाव डायलाग के उत्तर के लिए ध्यान दें : परिभाषित संपत्ति की अपनी संपत्ति होनी चाहिए। अन्यथा यह विफल हो जाएगा।

काम नहीं करता है:

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)

1

मुझे पता है कि यह पहले से ही एक उत्तर दिया गया प्रश्न है, लेकिन मैं जब चाहे तब वस्तुओं का उपयोग करके कुछ जोड़ना चाहूंगा।

यदि आप इसे किसी फ़ंक्शन का उपयोग करके असाइन करते हैं, तो यह 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

आप संस्थापित वस्तुओं पर न होते हुए भी अवधारणा के साथ खेल सकते हैं।


यह केवल तभी काम करता है जब आपको उस संपत्ति का मूल्य निर्धारित करने की आवश्यकता न हो।
गेब्रियल सी


0

आप इसे ES2017 के साथ आसानी से कर सकते हैं

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

यहाँ के privateProperty1और privateProperty2करने के लिए आवंटित कर रहे हैं exc1और exc2तदनुसार। अवशेष fooनव निर्मित चर को सौंपा गया है


0

मैंने एक छोटी सी लाइब्रेरी पर आधारित toJSON सॉल्यूशन का उपयोग किया है जिसे मैंने रनटाइम पर टाइप करने के लिए लिखा है https://stackoverflow.com/a/55917109/4236151


0

यहां एक और दृष्टिकोण है, हालांकि इंटरनेट एक्सप्लोरर समर्थन के बिना।

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

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

0

यह एक पुराना सवाल है, लेकिन मैं एक जवाब जोड़ रहा हूं क्योंकि इससे निपटने के लिए बहुत सरल तरीका है। 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"}


0

यहाँ प्रसार ऑपरेटर (...) के साथ मेरा दृष्टिकोण है:

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

const jsonWithoutId = JSON.stringify({...o, id:undefined});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.