2011-03-30 14 views
15

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

var entry = { 
    "FirstName": "John", 
    "LastName": "Doe", 
    .... 
}; 

आवरण की तरह है, क्योंकि यह, .net वर्ग से संपत्ति नामों के साथ मेल खाता है हमारे नामकरण परंपरा के अनुसार: इस तरह के रूप json एक साधारण व्यापार वस्तु का प्रतिनिधित्व करता है।

जब इन गुणों में से कुछ को बदलते हैं और जेसन वापस भेजते हैं, तो वेब सेवा अब शुरू में पास्कल केस की जगह ऊंट के मामले (फिर से, विधि पैरामीटर के लिए हमारे नामकरण सम्मेलन के अनुसार) की अपेक्षा करती है।

var entry = { 
    "firstName": "John", 
    "lastName": "Doe", 
    .... 
}; 

यह निश्चित रूप से काम नहीं करता है।

मैं JSON.stringify का उपयोग कर रहा हूं ताकि जेसन को एक स्ट्रिंग के रूप में वेब सेवा पर वापस भेज सकूं, और मैं देख रहा था कि ऊंट के मामले में कुंजी बदलने का कोई आसान तरीका है या नहीं। हालांकि, ऐसा लगता है कि मैं केवल मूल्य के साथ काम करने के लिए replacer param का उपयोग कर सकता हूं।

मैं कक्षा के क्रमबद्धता को बदल सकता हूं, लेकिन दिखाता हूं कि यह विकल्प नहीं है। कोई विचार?

धन्यवाद।

+2

क्या कोई कारण है कि आप जेएसओएन को वेब सेवा पर एक जटिल प्रकार के रूप में वापस नहीं भेजते हैं जो वास्तव में उस वस्तु से मेल खाता है जो मूल रूप से लौटाया गया था (चाहे संरचना या कक्षा)? इस तरह विधि पैरामीटर को आप जो कुछ भी चाहते हैं उसे कहा जा सकता है, और आपको ऑब्जेक्ट प्रॉपर्टी "नामकरण" के साथ खेलना नहीं है? – iivel

+0

बैकएंड को ठीक करें। आपका नामकरण सम्मेलन आपके खिलाफ काम कर रहा है, और नामकरण सम्मेलन में अनियमितताएं पैदा कर रहा है, जो नामकरण सम्मेलन कभी नहीं करना चाहिए। – Thanatos

उत्तर

28

आप लिखने से पहले कुंजी स्विच करने के लिए JSON replacer का उपयोग कर सकते हैं।

JSON.stringify(myVal, function (key, value) { 
    if (value && typeof value === 'object') { 
    var replacement = {}; 
    for (var k in value) { 
     if (Object.hasOwnProperty.call(value, k)) { 
     replacement[k && k.charAt(0).toLowerCase() + k.substring(1)] = value[k]; 
     } 
    } 
    return replacement; 
    } 
    return value; 
}); 

इसके विपरीत, आप एक JSON पुनरुद्धार का उपयोग कर सकते हैं।

JSON.parse(text, function (key, value) { 
    if (value && typeof value === 'object') 
     for (var k in value) { 
     if (/^[A-Z]/.test(k) && Object.hasOwnProperty.call(value, k)) { 
      value[k.charAt(0).toLowerCase() + k.substring(1)] = value[k]; 
      delete value[k]; 
     } 
     } 
     return value; 
    }); 

दूसरा वैकल्पिक तर्क एक ऐसा कार्य है जिसे पार्सिंग के हिस्से के रूप में बनाए गए प्रत्येक मूल्य या लिखे जाने वाले प्रत्येक मूल्य के साथ बुलाया जाता है। ये कार्यान्वयन बस चाबियों और निचले मामलों पर फिर से शुरू होते हैं जिनके पास ऊपरी-केस अक्षर होता है।

http://json.org/js.html पर replacers और revivers के लिए दस्तावेज़ नहीं है:

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

स्ट्रिंगफायर विधि वैकल्पिक प्रतिकूल फ़ंक्शन ले सकती है। इसे संरचना में प्रत्येक मान पर toJSON विधि (यदि कोई है तो) के बाद बुलाया जाएगा। यह प्रत्येक कुंजी और मान को पैरामीटर के रूप में पारित किया जाएगा, और यह कुंजी धारण करने के लिए बाध्य होगा। लौटाया गया मूल्य स्ट्रिंग किया जाएगा।

+0

मैं जेसन ऑब्जेक्ट से निपट रहा हूं जब तक कि मैं इसे अद्यतन के लिए वेब सेवा पर वापस भेजूं, तो इसका मतलब यह नहीं है कि मुझे जेसन ऑब्जेक्ट लेना होगा, उस पर स्ट्रिंग करना होगा, फिर इसे फिर से पार्स करें? – ScottE

+0

यह एक बहुत शानदार जवाब है। – mVChr

+0

@ स्कॉट, हाँ। क्षमा करें मुझे आपका प्रश्न पीछे हट गया है। पुनर्भुगतान की जरूरत नहीं है।स्ट्रिंगफाई केस शामिल करने के लिए संपादित किया गया। –

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