2014-10-08 3 views
5

मैं हाल ही में node.js में bson (बाइनरी JSON) मॉड्यूल लोड करने का प्रयास कर रहा था। एपीआई दस्तावेज़ अस्पष्ट थे, इसलिए मैंने सोचा कि वस्तुओं का निरीक्षण करने से मेरी मदद मिलेगी। निरीक्षण के परिणाम परेशान थे।% j विनिर्देशक console.log में कुछ गुणों को छोड़कर

अंत में मुझे पता चला कि ऐसा इसलिए था क्योंकि मैं %j का उपयोग कर रहा था जो "झूठ" है - यह किसी ऑब्जेक्ट की शब्दकोश कुंजी को प्रिंट नहीं करता है! (मैं "विशेषताओं" के लिए पाइथन शब्दावली का उपयोग कर रहा हूं क्योंकि एक बिंदु के साथ संदर्भित चीजों और ब्रैकेट के संदर्भ में चीजों के लिए "शब्दकोश कुंजी", क्योंकि मुझे जेएस में इन चीजों के लिए उचित नाम नहीं पता हैं।)

यहां है एक उदाहरण:

var bson = require("bson"); 
console.log("bson as %%j: %j", bson); 
console.log("bson as console.log: ", bson); 

और यहाँ उत्पादन है:

bson as %j: {"BSONPure":{},"BSONNative":{}} 
bson as console.log: { BSONPure: 
    { Code: [Function: Code], 
    Symbol: [Function: Symbol], 
    BSON: 
     { [Function: BSON] 
     BSON_INT32_MAX: 2147483647, 
     BSON_INT32_MIN: -2147483648, 
     BSON_INT64_MAX: 9223372036854776000, 
     BSON_INT64_MIN: -9223372036854776000, 
... 

मैंने सोचा था कि के बाद से x.keyx["key"] रूप में ही है, इसका मतलब है कि गुण और शब्दकोश कुंजी "एक ही बात" जे एस में हैं। मैंने प्रयोग किया कि BSON.BSONPure{} है, हालांकि BSON.BSONPure.BSON और BSON.BSONPure["BSON"]function ऑब्जेक्ट हैं!

इससे मुझे विश्वास होता है कि जो भी "%j" करता है, किसी भी तरह से कुछ चाबियाँ छोड़ना चाहिए। यह कैसे तय करता है कि किन कुंजीों को बाहर निकालना है? यह ऐसा क्यों करेगा? जेएस कभी-कभी वास्तव में भ्रमित भाषा है!

संबंधित Github टिकट: https://github.com/mongodb/js-bson/issues/97

+0

दोनों चीजें समान हैं (जैसा कि आप कहते हैं, 'x.key' और 'x [" key "]' पूरी तरह समतुल्य हैं), और उन्हें * गुण * कहा जाता है। – Bergi

उत्तर

14
node.js source में

नीचे, पारित कर दिया तर्क पर JSON.stringify() के लिए एक कॉल में %j प्लेसहोल्डर का परिणाम है।

बात यह है कि, bson चर पारित करने में, आप वैध JSON ऑब्जेक्ट पास नहीं कर रहे हैं। आप एक node.js मॉड्यूल पास कर रहे हैं जो अन्य चीजों के साथ कार्यों का निर्यात किया है।

तो, क्या होता है जब JSON.stringify() फ़ंक्शन हिट करता है?

तो अपरिभाषित, एक समारोह है, या एक प्रतीक रूपांतरण दौरान (जब यह एक वस्तु में पाया जाता है) या (जब यह एक सरणी में पाया जाता है) अशक्त करने के लिए सेंसर का सामना करना पड़ा है यह या तो छोड़ दिया जाता है। (MDN)

तो व्यवहार आप देख रहे हैं पूरी तरह से उम्मीद है, आप JSON जो मान्य JSON नहीं है के रूप में कुछ लॉग इन करने की कोशिश कर रहे हैं।

> JSON.stringify({name: "Bob"}) 
> "{"name":"Bob"}" 

> JSON.stringify({func: function(){}}) 
> "{}" 
+1

मुझे लगता है कि यह समझ में आता है। जब मैंने कुछ ऑब्जेक्ट मुद्रित किया, तो मैंने 'console.log (" x is "+ x) 'करने का प्रयास किया, जिसने अनुपयोगी' एक्स [ऑब्जेक्ट ऑब्जेक्ट] 'दिया। इसलिए मैंने जेएस में सामान को प्रिंट करने के लिए गुमराह किया, और मैंने जो जवाब देखा, वह मुझे% j का उपयोग करने के लिए कहा, जो विशेष उदाहरण के लिए काम करता था। लेकिन फिर मैंने% j का उपयोग "पायथन के repr() के जेएस संस्करण" के रूप में वास्तव में पढ़ने के बिना किया। दस्तावेज़ों के संदर्भ के लिए धन्यवाद – picomancer

संबंधित मुद्दे