मैं हाल ही में एक ही समस्या थी और इस .toJSON jQuery प्लगइन के साथ बाहर आया था जो एक संरचना के साथ एक JSON ऑब्जेक्ट में रूपांतरित करता है। यह गतिशील रूप से उत्पन्न रूपों के लिए भी स्पष्ट रूप से उपयोगी है जहां आप अपने उपयोगकर्ता को विशिष्ट स्थानों में अधिक फ़ील्ड जोड़ने देना चाहते हैं।
मुद्दा यह है कि आप वास्तव में एक फॉर्म का निर्माण करना चाहते हैं, ताकि इसकी एक संरचना स्वयं हो, इसलिए मान लें कि आप एक ऐसा फॉर्म बनाना चाहते हैं जहां उपयोगकर्ता शहर में अपने पसंदीदा स्थानों को सम्मिलित करता है: आप इस फॉर्म की कल्पना कर सकते हैं कि <places>...</places>
XML तत्व का प्रतिनिधित्व करने वाला एक स्थानों की सूची उपयोगकर्ता इस प्रकार पसंद करता है <place>...</place>
तत्वों की एक सूची उदाहरण के लिए एक <name>...</name>
तत्व, एक <type>...</type>
तत्व और फिर <activity>...</activity>
तत्वों की एक सूची है जो आप ऐसी जगह पर प्रदर्शन कर सकते हैं। तो आपका XML स्ट्रक्चर इस तरह होगा:
<places>
<place>
<name>Home</name>
<type>dwelling</type>
<activity>sleep</activity>
<activity>eat</activity>
<activity>watch TV</activity>
</place>
<place>...</place>
<place>...</place>
</places>
इसमें से JSON ऑब्जेक्ट कितना शांत होगा जो इस सटीक संरचना का प्रतिनिधित्व करेगा ताकि आप या तो कर पाएंगे:
- इस ऑब्जेक्ट को स्टोर करें क्योंकि यह किसी भी CouchDB- समान डेटाबेस में है
- इसे अपने $ _POST [] सर्वर साइड से पढ़ें और एक सही ढंग से नेस्टेड सरणी को फिर से बनाएं जिसे आप शब्दार्थ रूप से जोड़-तोड़ कर सकते हैं
- इसे अच्छी तरह से बनाई गई XML फ़ाइल में बदलने के लिए कुछ सर्वर-साइड स्क्रिप्ट का उपयोग करें (भले ही आपको इसकी सटीक संरचना ए-प्राथमिकता न पता हो)
- बस किसी भी तरह से इसका उपयोग किसी भी Node.js तरह सर्वर स्क्रिप्ट में है
ठीक है, इसलिए अब हमें यह सोचने की आवश्यकता है कि कोई प्रपत्र XML फ़ाइल का प्रतिनिधित्व कैसे कर सकता है।
बेशक <form>
टैग यह है root
, लेकिन फिर हमारे पास वह <place>
तत्व है जो एक कंटेनर है और डेटा तत्व नहीं है, इसलिए हम इसके लिए इनपुट टैग का उपयोग नहीं कर सकते हैं।
यहाँ जहाँ <fieldset>
टैग काम में आता है! हम <fieldset>
अपने फ़ॉर्म / XML प्रतिनिधित्व में सभी कंटेनर तत्वों का प्रतिनिधित्व करने के लिए टैग का उपयोग करेंगे और इस तरह से परिणाम प्राप्त करेंगे:
<form name="places">
<fieldset name="place">
<input type="text" name="name"/>
<select name="type">
<option value="dwelling">Dwelling</option>
<option value="restoration">Restoration</option>
<option value="sport">Sport</option>
<option value="administrative">Administrative</option>
</select>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
</fieldset>
</form>
जैसा कि आप इस रूप में देख सकते हैं, हम अनूठे नामों का नियम तोड़ रहे हैं, लेकिन यह ठीक है क्योंकि वे तत्व के एक सरणी में परिवर्तित हो जाएंगे और इस प्रकार उन्हें केवल सरणी के अंदर उनके सूचकांक द्वारा संदर्भित किया जाएगा।
इस बिंदु पर आप देख सकते हैं कि name="array[]"
फॉर्म के अंदर कोई नाम नहीं है और सब कुछ सुंदर, सरल और अर्थपूर्ण है।
अब हम चाहते हैं कि यह फॉर्म JSON ऑब्जेक्ट में परिवर्तित हो जाए जो इस तरह दिखाई देगा:
{'places':{
'place':[
{
'name': 'Home',
'type': 'dwelling',
'activity':[
'sleep',
'eat',
'watch TV'
]
},
{...},
{...}
]
}}
ऐसा करने के लिए मैंने इस jQuery प्लगइन को यहाँ विकसित किया है जो किसी ने इस कोड समीक्षा धागे में अनुकूलन करने में मदद की और इस तरह दिखता है:
$.fn.toJSO = function () {
var obj = {},
$kids = $(this).children('[name]');
if (!$kids.length) {
return $(this).val();
}
$kids.each(function () {
var $el = $(this),
name = $el.attr('name');
if ($el.siblings("[name=" + name + "]").length) {
if (!/radio|checkbox/i.test($el.attr('type')) || $el.prop('checked')) {
obj[name] = obj[name] || [];
obj[name].push($el.toJSO());
}
} else {
obj[name] = $el.toJSO();
}
});
return obj;
};
मैंने इसे और अधिक समझाने के लिए यह एक ब्लॉग पोस्ट भी बनाया ।
यह JSON (यहां तक कि रेडियो और चेक बॉक्स) के रूप में सब कुछ धर्मान्तरित करता है और आपके पास जो कुछ करना बाकी है वह कॉल है
$.post('script.php',('form').toJSO(), ...);
मुझे पता है कि JSON ऑब्जेक्ट्स में फ़ॉर्म बदलने .serialize()
और .serializeArray()
अधिकांश मामलों में निश्चित रूप से काम करने के लिए बहुत सारे तरीके हैं और ज्यादातर उपयोग किए जाने का इरादा है, लेकिन मुझे लगता है कि यह एक फॉर्म को XML नाम के रूप में लिखने का यह पूरा विचार सार्थक नामों के साथ और इसे एक में परिवर्तित करना है। अच्छी तरह से बनाई गई JSON ऑब्जेक्ट कोशिश के लायक है, यह भी कि आप बिना किसी चिंता के समान-नाम इनपुट टैग जोड़ सकते हैं, यदि आपको गतिशील रूप से उत्पन्न प्रपत्र डेटा को पुनः प्राप्त करने की आवश्यकता है।
मुझे उम्मीद है इससे किसी को सहायता मिलेगी!