HTML5 FormData ऑब्जेक्ट को JSON में कैसे बदलें? Jquery के बिना और ऑब्जेक्ट की तरह FormData में नेस्टेड गुणों से निपटने।
HTML5 FormData ऑब्जेक्ट को JSON में कैसे बदलें? Jquery के बिना और ऑब्जेक्ट की तरह FormData में नेस्टेड गुणों से निपटने।
जवाबों:
आप सीधे ऑब्जेक्ट forEach
पर भी उपयोग कर सकते FormData
हैं:
var object = {};
formData.forEach(function(value, key){
object[key] = value;
});
var json = JSON.stringify(object);
और जो ES6 तीर कार्यों के साथ एक ही समाधान पसंद करते हैं :
var object = {};
formData.forEach((value, key) => {object[key] = value});
var json = JSON.stringify(object);
और उन लोगों के लिए जो मल्टीपल सिलेक्ट लिस्ट या अन्य फॉर्म एलिमेंट के लिए मल्टीपल वैल्यूज़ के लिए सपोर्ट चाहते हैं (क्योंकि इस मुद्दे से संबंधित जवाब के नीचे बहुत सारी टिप्पणियाँ हैं, मैं एक संभावित समाधान जोड़ूंगा) :
var object = {};
formData.forEach((value, key) => {
// Reflect.has in favor of: object.hasOwnProperty(key)
if(!Reflect.has(object, key)){
object[key] = value;
return;
}
if(!Array.isArray(object[key])){
object[key] = [object[key]];
}
object[key].push(value);
});
var json = JSON.stringify(object);
यहाँ एक फिडल एक सरल बहु चयन सूची के साथ इस पद्धति के उपयोग को प्रदर्शित करता है।
यहाँ समाप्त होने वाले लोगों के लिए एक साइड नोट के रूप में, फॉर्म डेटा को जोंस में परिवर्तित करने का उद्देश्य एक XML HTTP अनुरोध के माध्यम से इसे एक सर्वर पर भेजना है, जिसे आप FormData
ऑब्जेक्ट को सीधे रूपांतरित किए बिना भेज सकते हैं । इस रूप में सरल:
var request = new XMLHttpRequest();
request.open("POST", "http://example.com/submitform.php");
request.send(formData);
संदर्भ के लिए MDN पर FormData ऑब्जेक्ट्स का उपयोग करना भी देखें :
जैसा कि मेरे जवाब में नीचे दी गई टिप्पणियों में से एक में बताया गया है कि JSON stringify
पद्धति सभी प्रकार की वस्तुओं के लिए बॉक्स से बाहर काम नहीं करेगी। किस प्रकार का समर्थन किया जाता है, इस बारे में अधिक जानकारी के लिए, मैं MDN प्रलेखन में विवरण अनुभाग का उल्लेख करना चाहूंगाJSON.stringify
।
वर्णन में यह भी उल्लेख किया गया है कि:
यदि मान में एक toJSON () विधि है, तो यह परिभाषित करना ज़िम्मेदार है कि डेटा किस क्रम में होगा।
इसका मतलब है कि आप toJSON
अपने कस्टम ऑब्जेक्ट्स को क्रमबद्ध करने के लिए तर्क के साथ अपनी खुद की क्रमांकन विधि की आपूर्ति कर सकते हैं । जैसे कि आप और अधिक आसानी से और अधिक जटिल ऑब्जेक्ट पेड़ों के लिए क्रमांकन समर्थन का निर्माण कर सकते हैं।
<SELECT MULTIPLE>
और कई मानों के साथ काम करता है <INPUT type="checkbox">
।
JSON.stringify(Object.fromEntries(formData));
बहुत अच्छा है
2019 में, इस तरह का कार्य सुपर-आसान हो गया।
JSON.stringify(Object.fromEntries(formData));
Object.fromEntries
: क्रोम 73+, फ़ायरफ़ॉक्स 63+, सफारी 12.1 में समर्थित है
<select multiple>
या <input type="checkbox">
😞
JSON.stringify(Object.fromEntries(formData.entries()));
यहां लाइब्रेरी के उपयोग के बिना इसे अधिक कार्यात्मक शैली में करने का एक तरीका है।
Array.from(formData.entries()).reduce((memo, pair) => ({
...memo,
[pair[0]]: pair[1],
}), {});
उदाहरण:
document.getElementById('foobar').addEventListener('submit', (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const data = Array.from(formData.entries()).reduce((memo, pair) => ({
...memo,
[pair[0]]: pair[1],
}), {});
document.getElementById('output').innerHTML = JSON.stringify(data);
});
<form id='foobar'>
<input name='baz' />
<input type='submit' />
</form>
<pre id='output'>Input some value and submit</pre>
यदि आपके पास एक ही नाम के साथ कई प्रविष्टियाँ हैं, उदाहरण के लिए यदि आप उपयोग करते हैं <SELECT multiple>
या <INPUT type="checkbox">
एक ही नाम के साथ कई हैं , तो आपको इस बात का ध्यान रखना और मूल्य की एक सरणी बनाना होगा। अन्यथा आप केवल अंतिम चयनित मान प्राप्त करते हैं।
यहाँ आधुनिक ईएस 6-प्रकार है:
function formToJSON( elem ) {
let output = {};
new FormData( elem ).forEach(
( value, key ) => {
// Check if property already exist
if ( Object.prototype.hasOwnProperty.call( output, key ) ) {
let current = output[ key ];
if ( !Array.isArray( current ) ) {
// If it's not an array, convert it to an array.
current = output[ key ] = [ current ];
}
current.push( value ); // Add the new value to the array.
} else {
output[ key ] = value;
}
}
);
return JSON.stringify( output );
}
थोड़ा पुराना कोड (लेकिन अभी भी IE11 द्वारा समर्थित नहीं है, क्योंकि यह समर्थन नहीं करता है ForEach
या entries
चालू है FormData
)
function formToJSON( elem ) {
var current, entries, item, key, output, value;
output = {};
entries = new FormData( elem ).entries();
// Iterate over values, and assign to item.
while ( item = entries.next().value )
{
// assign to variables to make the code more readable.
key = item[0];
value = item[1];
// Check if key already exist
if (Object.prototype.hasOwnProperty.call( output, key)) {
current = output[ key ];
if ( !Array.isArray( current ) ) {
// If it's not an array, convert it to an array.
current = output[ key ] = [ current ];
}
current.push( value ); // Add the new value to the array.
} else {
output[ key ] = value;
}
}
return JSON.stringify( output );
}
आप फॉर्मडेटा () का उपयोग करके इसे प्राप्त कर सकते हैं ऑब्जेक्ट । यह फ़ॉर्मडैट ऑब्जेक्ट, प्रपत्र की वर्तमान कुंजियों / मानों के लिए प्रत्येक तत्व की नाम संपत्ति और मानों के लिए उनके प्रस्तुत मूल्य का उपयोग करके पॉपुलेटेड होगा। यह फ़ाइल इनपुट सामग्री को भी एनकोड करेगा।
उदाहरण:
var myForm = document.getElementById('myForm');
myForm.addEventListener('submit', function(event)
{
event.preventDefault();
var formData = new FormData(myForm),
result = {};
for (var entry of formData.entries())
{
result[entry[0]] = entry[1];
}
result = JSON.stringify(result)
console.log(result);
});
for (const [key, value] of formData.entries())
समारोह का उपयोग करने के लिए आसान
मैंने इसके लिए एक फंक्शन बनाया है
function FormDataToJSON(FormElement){
var formData = new FormData(FormElement);
var ConvertedJSON= {};
for (const [key, value] of formData.entries())
{
ConvertedJSON[key] = value;
}
return ConvertedJSON
}
उदाहरण उपयोग
var ReceivedJSON = FormDataToJSON(document.getElementById('FormId');)
इस कोड में मैंने for
लूप का उपयोग करके खाली JSON वेरिएबल बनाया है जिसका मैंने उपयोग किया हैkey
फॉर्मडैटा ऑब्जेक्ट से लेकर हर इट्रेशन में JSON कीज तक किया है।
आप इस कोड को मेरे जेएस लाइब्रेरी में GitHub पर मुझे सुझाएं अगर मुझे इसमें सुधार की आवश्यकता है तो मुझे कोड दिया गया है यहां https://github.com/alijamal14/Utilities/blob/master/Utilities.js
<select multiple>
या नहीं <input type="checkbox">
।
यह पोस्ट पहले से ही एक वर्ष पुराना है ... लेकिन, मुझे वास्तव में, वास्तव में ES6 @dzuc उत्तर पसंद है। हालाँकि यह कई चयनों या चेकबॉक्स को संभालने में सक्षम नहीं होने के कारण अधूरा है। यह पहले ही इंगित किया गया है और कोड समाधान की पेशकश की गई है। मैं उन्हें भारी लगता हूं और अनुकूलित नहीं। इसलिए मैंने इन मामलों को संभालने के लिए @dzuc पर आधारित 2 संस्करण लिखे:
let r=Array.from(fd).reduce(
(o , [k,v]) => (
(!o[k])
? {...o , [k] : v}
: {...o , [k] : [...o[k] , v]}
)
,{}
);
let obj=JSON.stringify(r);
एक पंक्ति हॉटशॉट संस्करण:
Array.from(fd).reduce((o,[k,v])=>((!o[k])?{...o,[k]:v}:{...o,[k]:[...o[k],v]}),{});
[]
प्रत्यय होना चाहिए ।let r=Array.from(fd).reduce(
(o , [k,v]) => (
(k.split('[').length>1)
? (k=k.split('[')[0]
, (!o[k])
? {...o , [k] : [v]}
: {...o , [k] : [...o[k] , v ]}
)
: {...o , [k] : v}
)
,{}
);
let obj=JSON.stringify(r);
एक पंक्ति हॉटशॉट संस्करण:
Array.from(fd).reduce((o,[k,v])=>((k.split('[').length>1)?(k=k.split('[')[0],(!o[k])?{...o,[k]:[v]}:{...o,[k]:[...o[k],v]}):{...o,[k]:v}),{});
पिछली बार जब मैंने पिछला दूसरा मामला लिखा था, तब काम पर यह मामला आया था कि PHP के रूप में बहु-स्तरों पर चेकबॉक्स हैं। मैंने पिछले मामले और इस एक का समर्थन करने के लिए एक नया मामला लिखा था। मैंने इस मामले को बेहतर दिखाने के लिए एक स्निपेट बनाया, इस डेमो के लिए कंसोल पर परिणाम शो, इसे आपकी ज़रूरत के लिए संशोधित करें। प्रदर्शन के साथ समझौता किए बिना मैं इसे सर्वश्रेष्ठ रूप से अनुकूलित करने की कोशिश कर सकता हूं, हालांकि, यह कुछ मानव पठनीयता से समझौता करता है। यह लाभ उठाता है कि सरणियाँ ऑब्जेक्ट हैं और सरणियों को इंगित करने वाले चर को संदर्भ के रूप में रखा जाता है। इस एक के लिए कोई hotshot, मेरे मेहमान हो।
let nosubmit = (e) => {
e.preventDefault();
const f = Array.from(new FormData(e.target));
const obj = f.reduce((o, [k, v]) => {
let a = v,
b, i,
m = k.split('['),
n = m[0],
l = m.length;
if (l > 1) {
a = b = o[n] || [];
for (i = 1; i < l; i++) {
m[i] = (m[i].split(']')[0] || b.length) * 1;
b = b[m[i]] = ((i + 1) == l) ? v : b[m[i]] || [];
}
}
return { ...o, [n]: a };
}, {});
console.log(obj);
}
document.querySelector('#theform').addEventListener('submit', nosubmit, {capture: true});
<h1>Multilevel Form</h1>
<form action="#" method="POST" enctype="multipart/form-data" id="theform">
<input type="hidden" name="_id" value="93242" />
<input type="hidden" name="_fid" value="45c0ec96929bc0d39a904ab5c7af70ef" />
<label>Select:
<select name="uselect">
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
</select>
</label>
<br /><br />
<label>Checkboxes one level:<br/>
<input name="c1[]" type="checkbox" checked value="1"/>v1
<input name="c1[]" type="checkbox" checked value="2"/>v2
<input name="c1[]" type="checkbox" checked value="3"/>v3
</label>
<br /><br />
<label>Checkboxes two levels:<br/>
<input name="c2[0][]" type="checkbox" checked value="4"/>0 v4
<input name="c2[0][]" type="checkbox" checked value="5"/>0 v5
<input name="c2[0][]" type="checkbox" checked value="6"/>0 v6
<br/>
<input name="c2[1][]" type="checkbox" checked value="7"/>1 v7
<input name="c2[1][]" type="checkbox" checked value="8"/>1 v8
<input name="c2[1][]" type="checkbox" checked value="9"/>1 v9
</label>
<br /><br />
<label>Radios:
<input type="radio" name="uradio" value="yes">YES
<input type="radio" name="uradio" checked value="no">NO
</label>
<br /><br />
<input type="submit" value="Submit" />
</form>
Array.from(fd).reduce((obj, [k, v]) => ({...obj, [k]: v}), {});
hotshot संस्करण es2018
FormData विधि .entries
और for of
अभिव्यक्ति IE11 और Safari में समर्थित नहीं है ।
यहाँ सफारी, क्रोम, फ़ायरफ़ॉक्स और एज का समर्थन करने के लिए एक सरल संस्करण है
function formDataToJSON(formElement) {
var formData = new FormData(formElement),
convertedJSON = {};
formData.forEach(function(value, key) {
convertedJSON[key] = value;
});
return convertedJSON;
}
चेतावनी: यह उत्तर IE11 में काम नहीं करता है।
FormData forEach
IE11 में एक विधि नहीं है ।
मैं अभी भी सभी प्रमुख ब्राउज़रों का समर्थन करने के लिए एक अंतिम समाधान खोज रहा हूं।
यदि आप लॉश का उपयोग कर रहे हैं, तो इसे संक्षिप्त रूप से किया जा सकता है fromPairs
import {fromPairs} from 'lodash';
const object = fromPairs(Array.from(formData.entries()));
यदि आपको नेस्टेड फ़ील्ड्स को क्रमबद्ध करने के लिए समर्थन की आवश्यकता है, तो PHP कैसे फ़ील्ड्स को हैंडल करती है, आप निम्न फ़ंक्शन का उपयोग कर सकते हैं
function update(data, keys, value) {
if (keys.length === 0) {
// Leaf node
return value;
}
let key = keys.shift();
if (!key) {
data = data || [];
if (Array.isArray(data)) {
key = data.length;
}
}
// Try converting key to a numeric value
let index = +key;
if (!isNaN(index)) {
// We have a numeric index, make data a numeric array
// This will not work if this is a associative array
// with numeric keys
data = data || [];
key = index;
}
// If none of the above matched, we have an associative array
data = data || {};
let val = update(data[key], keys, value);
data[key] = val;
return data;
}
function serializeForm(form) {
return Array.from((new FormData(form)).entries())
.reduce((data, [field, value]) => {
let [_, prefix, keys] = field.match(/^([^\[]+)((?:\[[^\]]*\])*)/);
if (keys) {
keys = Array.from(keys.matchAll(/\[([^\]]*)\]/g), m => m[1]);
value = update(data[prefix], keys, value);
}
data[prefix] = value;
return data;
}, {});
}
document.getElementById('output').textContent = JSON.stringify(serializeForm(document.getElementById('form')), null, 2);
<form id="form">
<input name="field1" value="Field 1">
<input name="field2[]" value="Field 21">
<input name="field2[]" value="Field 22">
<input name="field3[a]" value="Field 3a">
<input name="field3[b]" value="Field 3b">
<input name="field3[c]" value="Field 3c">
<input name="field4[x][a]" value="Field xa">
<input name="field4[x][b]" value="Field xb">
<input name="field4[x][c]" value="Field xc">
<input name="field4[y][a]" value="Field ya">
<input name="field5[z][0]" value="Field z0">
<input name="field5[z][]" value="Field z1">
<input name="field6.z" value="Field 6Z0">
<input name="field6.z" value="Field 6Z1">
</form>
<h2>Output</h2>
<pre id="output">
</pre>
आप यह कोशिश कर सकते हैं
formDataToJSON($('#form_example'));
# Create a function to convert the serialize and convert the form data
# to JSON
# @param : $('#form_example');
# @return a JSON Stringify
function formDataToJSON(form) {
let obj = {};
let formData = form.serialize();
let formArray = formData.split("&");
for (inputData of formArray){
let dataTmp = inputData.split('=');
obj[dataTmp[0]] = dataTmp[1];
}
return JSON.stringify(obj);
}
भले ही @dzuc का उत्तर पहले से ही बहुत अच्छा है, आप इसे और भी अधिक सुरुचिपूर्ण बनाने के लिए सरणी विनाशकारी (आधुनिक ब्राउज़रों में उपलब्ध या बैबेल के साथ) का उपयोग कर सकते हैं:
// original version from @dzuc
const data = Array.from(formData.entries())
.reduce((memo, pair) => ({
...memo,
[pair[0]: pair[1],
}), {})
// with array destructuring
const data = Array.from(formData.entries())
.reduce((memo,[key, value]) => ({
...memo,
[key]: value,
}), {})
अपमानजनक एक-लाइनर!
Array.from(fd).reduce((obj, [k, v]) => ({...obj, [k]: v}), {});
आज मुझे पता चला है कि फ़ायरफ़ॉक्स में ऑब्जेक्ट स्प्रेड सपोर्ट और एरो विनाशकारी है!
यदि निम्नलिखित वस्तुएं आपकी आवश्यकताओं को पूरा करती हैं, तो आप भाग्य में हैं:
[['key','value1'], ['key2','value2']
(जैसे कि फॉर्मडैट आपको क्या देता है) कुंजी-> मान ऑब्जेक्ट में {key1: 'value1', key2: 'value2'}
और इसे JSON स्ट्रिंग में कनवर्ट करें।यहां वह कोड है जिसकी आपको आवश्यकता होगी:
const data = new FormData(document.querySelector('form'));
const json = JSON.stringify(Array.from(data).reduce((o,[k,v])=>(o[k]=v,o),{}));
आशा है कि यह किसी की मदद करता है।
मैंने अब तक FormData.getAll पद्धति का कोई उल्लेख नहीं देखा है ।
एक FormData वस्तु के भीतर से सभी किसी कुंजी के साथ जुड़े मूल्यों लौटने इसके अलावा, इसे का उपयोग बहुत आसान हो जाता है Object.fromEntries के रूप में यहाँ दूसरों के द्वारा निर्दिष्ट विधि।
var formData = new FormData(document.forms[0])
var obj = Object.fromEntries(
Array.from(formData.keys()).map(key => [
key, formData.getAll(key).length > 1
? formData.getAll(key)
: formData.get(key)
])
)
कार्रवाई में स्निपेट
var formData = new FormData(document.forms[0])
var obj = Object.fromEntries(Array.from(formData.keys()).map(key => [key, formData.getAll(key).length > 1 ? formData.getAll(key) : formData.get(key)]))
document.write(`<pre>${JSON.stringify(obj)}</pre>`)
<form action="#">
<input name="name" value="Robinson" />
<input name="items" value="Vin" />
<input name="items" value="Fromage" />
<select name="animals" multiple id="animals">
<option value="tiger" selected>Tigre</option>
<option value="turtle" selected>Tortue</option>
<option value="monkey">Singe</option>
</select>
</form>
मेरे लिए काम किया
var myForm = document.getElementById("form");
var formData = new FormData(myForm),
obj = {};
for (var entry of formData.entries()){
obj[entry[0]] = entry[1];
}
console.log(obj);
<select multiple>
या<input type="checkbox">
मेरे केस फॉर्म में डेटा डेटा था, फायर बेस एक ऑब्जेक्ट की उम्मीद कर रहा था, लेकिन डेटा में ऑब्जेक्ट के साथ-साथ अन्य सभी सामान शामिल हैं इसलिए मैंने डेटा की कोशिश की। यह काम किया !!!
मैं यहां देर से पहुंच रहा हूं। हालाँकि, मैंने एक सरल विधि बनाई जो इनपुट प्रकार = "चेकबॉक्स" के लिए जाँच करता है
var formData = new FormData($form.get(0));
var objectData = {};
formData.forEach(function (value, key) {
var updatedValue = value;
if ($('input[name="' + key + '"]').attr("type") === "checkbox" && $('input[name="' + key + '"]').is(":checked")) {
updatedValue = true; // we don't set false due to it is by default on HTML
}
objectData[key] = updatedValue;
});
var jsonData = JSON.stringify(objectData);
मुझे उम्मीद है कि यह किसी और की मदद करता है।
आप बिना किसी खास चीज का इस्तेमाल किए आसानी से इस काम को कर सकते हैं। नीचे दिए गए कोड की तरह एक कोड पर्याप्त होगा।
var form = $(e.currentTarget);
var formData = objectifyForm(form);
function objectifyForm(formArray) {
var returnArray = {};
for (var i = 0; i < formArray[0].length; i++) {
var name = formArray[0][i]['name'];
if (name == "") continue;
if (formArray[0][i]['type'] == "hidden" && returnArray[name] != undefined) continue;
if ($(formArray[0][i]).attr("type") == "radio") {
var radioInputs = $("[name='" + name + "']");
var value = null;
radioInputs.each(function (radio) {
if ($(this)[0].checked == true) {
value = $(this).attr("id").split("_")[$(this).attr("id").split("_").length - 1];
}
});
returnArray[name] = value;
}
else if ($(formArray[0][i]).attr("type") == "checkbox") {
returnArray[name] = $(formArray[0][i])[0].checked;
}
else
returnArray[name] = formArray[0][i]['value'];
}
return returnArray;
};
JSON.stringify()
मदद करता है? हो सकता है कि आप कुछ ऐसा करने की कोशिश करें जो अन्य तरीके से किया जा सकता है?