JSON.stringify () Prototype.js के साथ सरणी bizarreness

वोट
78

मैं, के साथ अपने एप्लिकेशन के वर्तमान संस्करण और पुराने एक है यह पता लगाने की क्या मेरी json serializing के साथ त्रुटि हुई है कोशिश कर रहा हूँ और कुछ आश्चर्यजनक (JSON पुस्तकालय का उपयोग करना json.org से रास्ता JSON.stringify () काम करता है में मतभेद लग रहा है )।

मेरे एप्लिकेशन के पुराने संस्करण में:

 JSON.stringify({a:[1,2]})

मुझे इस देता है;

{\a\:[1,2]}

नए संस्करण में,

 JSON.stringify({a:[1,2]})

मुझे इस देता है;

{\a\:\[1, 2]\}

किसी भी विचार ही पुस्तकालय बनाने के लिए बदल गया होगा क्या नए संस्करण में सरणी कोष्ठक के आसपास उद्धरण डाल?

02/04/2009 को 17:48
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


11 जवाब

वोट
1

यहाँ कैसे मैं इसे से निपटने हूँ।

var methodCallString =  Object.toJSON? Object.toJSON(options.jsonMethodCall) :  JSON.stringify(options.jsonMethodCall);
02/04/2009 को 18:36
का स्रोत उपयोगकर्ता

वोट
2

मुझे लगता है कि प्रोटोटाइप के साथ धाराप्रवाह नहीं कर रहा हूँ, लेकिन मैं अपने में यह देखा डॉक्स :

Object.toJSON({"a":[1,2]})

मुझे यकीन है कि अगर यह एक ही समस्या वर्तमान एन्कोडिंग है, हालांकि होता नहीं हूँ।

वहाँ भी एक लंबे समय तक है ट्यूटोरियल प्रोटोटाइप के साथ JSON का उपयोग कर के बारे में।

02/04/2009 को 18:58
का स्रोत उपयोगकर्ता

वोट
4

मुझे लगता है कि एक बेहतर समाधान शामिल करने के लिए यह सिर्फ के बाद प्रोटोटाइप लोड किया गया है हो सकता है

JSON = JSON || {};

JSON.stringify = function(value) { return value.toJSON(); };

JSON.parse = JSON.parse || function(jsonsring) { return jsonsring.evalJSON(true); };

इस प्रोटोटाइप समारोह मानक JSON.stringify () और JSON.parse () के रूप में उपलब्ध है, लेकिन देशी JSON.parse () रहता है, अगर यह उपलब्ध है, इसलिए इस पुराने ब्राउज़र के साथ चीजों को अधिक संगत बना देता है।

25/08/2009 को 11:25
का स्रोत उपयोगकर्ता

वोट
7

थोड़ा अधिक सटीक बनाने के लिए संपादित करें:

कोड की समस्या कुंजी बिट JSON.org (और ECMAScript 5 के JSON वस्तु के अन्य कार्यान्वयन) से JSON पुस्तकालय में है:

        अगर (मूल्य && typeof मूल्य === "वस्तु '&&
                typeof value.toJSON === "समारोह ') {
            मूल्य = value.toJSON (कुंजी);
        }

समस्या यह है कि प्रोटोटाइप पुस्तकालय सरणी फैली एक toJSON विधि है, जो JSON ऑब्जेक्ट कोड में ऊपर फोन करेगा शामिल करने के लिए है। जब JSON ऑब्जेक्ट सरणी मान हिट यह सरणी जो प्रोटोटाइप में परिभाषित किया गया है पर toJSON कहता है, और कहा कि विधि सरणी के एक स्ट्रिंग संस्करण देता है। इसलिए, सरणी कोष्ठक के आसपास उद्धरण।

आप सरणी से toJSON हटाते हैं आपत्ति JSON पुस्तकालय ठीक से काम करना चाहिए। या, बस JSON पुस्तकालय का उपयोग करें।

10/02/2010 को 19:32
का स्रोत उपयोगकर्ता

वोट
71

के बाद से JSON.stringify कुछ ब्राउज़रों के साथ हाल ही में शिपिंग दिया, मैं प्रोटोटाइप के toJSON के बजाय इसका उपयोग करने का सुझाव होगा। तुम तो window.JSON && window.JSON.stringify के लिए जाँच करेगा और केवल अन्यथा json.org पुस्तकालय में शामिल हैं (के माध्यम से document.createElement('script')...)। असंगतियां को हल करने के का उपयोग करें:

if(window.Prototype) {
    delete Object.prototype.toJSON;
    delete Array.prototype.toJSON;
    delete Hash.prototype.toJSON;
    delete String.prototype.toJSON;
}
30/06/2010 को 11:44
का स्रोत उपयोगकर्ता

वोट
74

समारोह JSON.stringify () में परिभाषित ECMAScript 5 और (201 पेज - JSON वस्तु, छद्म कोड पृष्ठ 205) ऊपर , समारोह toJSON () जब उपलब्ध वस्तुओं पर उपयोग करता है।

क्योंकि Prototype.js (या किसी अन्य पुस्तकालय है कि आप प्रयोग कर रहे हैं) एक Array.prototype.toJSON () फंक्शन को परिभाषित करता है, सरणियों पहले Array.prototype.toJSON () तो स्ट्रिंग JSON.stringify (द्वारा उद्धृत) का उपयोग करते हुए, इसलिए तार में बदल रही हैं सरणियों के आसपास गलत अतिरिक्त उद्धरण।

समाधान इसलिए सीधी-सपाट और तुच्छ (इस राफेल Schweikert के जवाब का एक सरलीकृत संस्करण है) है:

delete Array.prototype.toJSON

इस लाइब्रेरी को सरणियों के लिए एक toJSON () फ़ंक्शन संपत्ति पर भरोसा करते हैं पर पाठ्यक्रम साइड इफेक्ट का उत्पादन करता है। लेकिन मैं इस एक छोटी सी असुविधा ECMAScript 5 के साथ असंगति पर विचार पाते हैं।

यह ध्यान दिया जाना चाहिए कि JSON वस्तु ECMAScript 5 में परिभाषित कुशलतापूर्वक आधुनिक ब्राउज़रों में लागू किया गया है और इसलिए सबसे अच्छा समाधान मानक के अनुरूप और मौजूदा पुस्तकालयों को संशोधित करने के लिए है।

07/07/2011 को 14:10
का स्रोत उपयोगकर्ता

वोट
1

मेरे सहिष्णु समाधान जाँच करता है कि Array.prototype.toJSON JSON stringify के लिए हानिकारक है और यह रहता है के रूप में उम्मीद जब संभव आसपास के कोड काम करने देने के लिए:

var dummy = { data: [{hello: 'world'}] }, test = {};

if(Array.prototype.toJSON) {
    try {
        test = JSON.parse(JSON.stringify(dummy));
        if(!test || dummy.data !== test.data) {
            delete Array.prototype.toJSON;
        }
    } catch(e) {
        // there only hope
    }
}
02/02/2012 को 11:37
का स्रोत उपयोगकर्ता

वोट
1

के रूप में लोगों ने बताया है, इस Prototype.js की वजह से है - विशेष रूप से पहले 1.7 संस्करण। मैं एक ऐसी ही स्थिति थी, लेकिन कोड है कि संचालित चाहे Prototype.js वहाँ था या नहीं करने के लिए किया था; इस मैं सिर्फ Array.prototype.toJSON के रूप में मुझे यकीन है कि क्या यह पर निर्भर करता है नहीं कर रहा हूँ नहीं हटा सकते हैं मतलब है। उस स्थिति के लिए यह सबसे अच्छा समाधान मैं के साथ आया है:

function safeToJSON(item){ 
    if ([1,2,3] === JSON.parse(JSON.stringify([1,2,3]))){
        return JSON.stringify(item); //sane behavior
    } else { 
        return item.toJSON(); // Prototype.js nonsense
    }
}

उम्मीद है कि यह किसी को मदद मिलेगी।

08/11/2012 को 08:50
का स्रोत उपयोगकर्ता

वोट
14

सम्भावित समाधान है जो अन्य प्रोटोटाइप निर्भरता को प्रभावित नहीं करेगा होगा:

var _json_stringify = JSON.stringify;
JSON.stringify = function(value) {
    var _array_tojson = Array.prototype.toJSON;
    delete Array.prototype.toJSON;
    var r=_json_stringify(value);
    Array.prototype.toJSON = _array_tojson;
    return r;
};

यह JSON.stringify साथ सरणी toJSON असंगति का ख्याल रखता है और यह भी toJSON कार्यक्षमता को बरकरार रखे हुए के रूप में अन्य प्रोटोटाइप पुस्तकालयों उस पर निर्भर हो सकता है।

12/12/2012 को 22:17
का स्रोत उपयोगकर्ता

वोट
0

तुम सब कुछ को मारने के लिए, और एक कोड है कि सबसे ब्राउज़रों पर ठीक हो जाएगा नहीं करना चाहते हैं, तो आप इसे इस तरह कर सकता है:

(function (undefined) { // This is just to limit _json_stringify to this scope and to redefine undefined in case it was
  if (true ||typeof (Prototype) !== 'undefined') {
    // First, ensure we can access the prototype of an object.
    // See http://stackoverflow.com/questions/7662147/how-to-access-object-prototype-in-javascript
    if(typeof (Object.getPrototypeOf) === 'undefined') {
      if(({}).__proto__ === Object.prototype && ([]).__proto__ === Array.prototype) {
        Object.getPrototypeOf = function getPrototypeOf (object) {
          return object.__proto__;
        };
      } else {
        Object.getPrototypeOf = function getPrototypeOf (object) {
          // May break if the constructor has been changed or removed
          return object.constructor ? object.constructor.prototype : undefined;
        }
      }
    }

    var _json_stringify = JSON.stringify; // We save the actual JSON.stringify
    JSON.stringify = function stringify (obj) {
      var obj_prototype = Object.getPrototypeOf(obj),
          old_json = obj_prototype.toJSON, // We save the toJSON of the object
          res = null;
      if (old_json) { // If toJSON exists on the object
        obj_prototype.toJSON = undefined;
      }
      res = _json_stringify.apply(this, arguments);
      if (old_json)
        obj_prototype.toJSON = old_json;
      return res;
    };
  }
}.call(this));

इस परिसर में लगता है, लेकिन इस जटिल केवल सबसे उपयोग के मामलों को संभालने के लिए है। मुख्य विचार अधिभावी है JSON.stringifyदूर करने के लिए toJSONवस्तु एक तर्क के रूप में पारित से, फिर पुराने फोन JSON.stringify, और अंत में इसे फिर से स्थापित।

21/04/2015 को 17:36
का स्रोत उपयोगकर्ता

वोट
2

इस कोड को मैं एक ही मुद्दे के लिए प्रयोग किया जाता है:

function stringify(object){
      var Prototype = window.Prototype
      if (Prototype && Prototype.Version < '1.7' &&
          Array.prototype.toJSON && Object.toJSON){
              return Object.toJSON(object)
      }
      return JSON.stringify(object)
}

आप अगर प्रोटोटाइप मौजूद है, तो आप संस्करण की जांच की जाँच करें। JSON.stringify पर वापस आने () पुराने संस्करण अन्य सभी मामलों में Object.toJSON (यदि परिभाषित किया गया है) का उपयोग करते हैं

15/10/2015 को 13:51
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more