এইচটিএমএল 5 ফর্মডাটা অবজেক্টটিকে কীভাবে JSON এ রূপান্তর করবেন? Jquery এবং কোনও বস্তুর মতো ফর্মডাটাতে নেস্টেড বৈশিষ্ট্যগুলি পরিচালনা করা ছাড়াই।
এইচটিএমএল 5 ফর্মডাটা অবজেক্টটিকে কীভাবে JSON এ রূপান্তর করবেন? Jquery এবং কোনও বস্তুর মতো ফর্মডাটাতে নেস্টেড বৈশিষ্ট্যগুলি পরিচালনা করা ছাড়াই।
উত্তর:
এছাড়াও আপনি ব্যবহার করতে পারে 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);
এখানে একটি ফিডল একটি সাধারণ বহু নির্বাচনী তালিকা সহ এই পদ্ধতিটির ব্যবহার প্রদর্শন করছে।
এখানে শেষ হওয়া ব্যক্তিদের পক্ষে পার্শ্ব নোট হিসাবে, ফর্ম ডেটাটিকে জসন-এ রূপান্তর করার উদ্দেশ্যটি কোনও এক্সএমএল এইচটিটিপি অনুরোধের মাধ্যমে সার্ভারে প্রেরণ করা আপনি FormData
অবজেক্টটিকে রূপান্তর না করে সরাসরি প্রেরণ করতে পারবেন । এই হিসাবে সহজ:
var request = new XMLHttpRequest();
request.open("POST", "http://example.com/submitform.php");
request.send(formData);
দেখুন এছাড়াও ব্যবহার FormData অবজেক্টস রেফারেন্সের জন্য MDN উপর :
আমার উত্তরের নীচে একটি মন্তব্যে উল্লিখিত হিসাবে JSON stringify
পদ্ধতি সমস্ত ধরণের অবজেক্টের জন্য বাক্সের বাইরে কাজ করবে না। কোন ধরণের সমর্থিত সে সম্পর্কে আরও তথ্যের জন্য আমি এমডিএন ডকুমেন্টেশনের বিবরণ বিভাগটি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>
বা handle এর সাথে পরিচালনা করে না<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">
যত্ন নিতে হবে এবং মানটির একটি অ্যারে তৈরি করতে হবে। অন্যথায় আপনি কেবল সর্বশেষ নির্বাচিত মান পাবেন।
আধুনিক ES6- রূপটি এখানে:
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 );
}
সামান্য পুরানো কোড (তবে এখনও আই 11 সমর্থন করে না, যেহেতু এটি সমর্থন করে না 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
প্রতিটি ইট্রেশনে ফর্মডাটা অবজেক্ট থেকে জেএসএন কীগুলিতে ব্যবহার করেছি।
আপনি এই কোডটি আমার জেএস লাইব্রেরিতে গীটহাবটিতে সন্ধান করেন যদি উন্নতির প্রয়োজন হয় তবে আমাকে পরামর্শ দিন আমাকে কোডটি এখানে রেখেছেন https://github.com/alijamal14/ ইউটিলিটিস / ব্লব / মাস্টার / ইউটিলিটিস.জেএস
<select multiple>
বা এর একাধিক নির্বাচিত মানগুলি পরিচালনা করে না <input type="checkbox">
।
এই পোস্টটি ইতিমধ্যে এক বছরের পুরানো ... তবে, আমি সত্যিই, সত্যিই ES6 @dzuc উত্তরটি পছন্দ করি। তবে একাধিক নির্বাচন বা চেকবক্সগুলি পরিচালনা করতে সক্ষম না হয়ে এটি অসম্পূর্ণ। এটি ইতিমধ্যে নির্দেশ করেছে এবং কোড সমাধান সরবরাহ করা হয়েছে। আমি তাদের ভারী এবং অনুকূলিত না। সুতরাং আমি এই মামলাগুলি পরিচালনা করতে @dzuc এর উপর ভিত্তি করে একটি দুটি সংস্করণ লিখেছি:
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}),{});
গতবার থেকে আমি পূর্বের দ্বিতীয় কেসটি লিখেছিলাম, কাজের সময়ে এটি এমন একটি ঘটনা এসেছিল যে পিএইচপি ফর্মটিতে বহু স্তরের চেকবক্স রয়েছে। আমি পূর্ববর্তী কেস এবং এইটিকে সমর্থন করার জন্য একটি নতুন কেস লিখেছি। আমি এই কেসটি আরও ভালভাবে প্রদর্শন করার জন্য একটি স্নিপেট তৈরি করেছি, এই ডেমোটির কনসোলে ফলাফল শো, এটি আপনার প্রয়োজন অনুসারে পরিবর্তন করুন। পারফরম্যান্সের সাথে আপস না করে এটিকে আমি সর্বোত্তম করার চেষ্টা করলাম, তবে এটি কিছু মানুষের পাঠযোগ্যতার সাথে আপস করে। এটির সুবিধাটি নেয় যে অ্যারেগুলি হ'ল অবজেক্ট এবং ভেরিয়েবলগুলি অ্যারেগুলিকে নির্দেশ করে রেফারেন্স হিসাবে রাখা হয়। এটির জন্য কোনও হটশট নেই, আমার অতিথি হোন।
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}), {});
হটশট সংস্করণ es2018
আইএম 11 .entries
এবং সাফারিতে ফর্মডাটা পদ্ধতি এবং for of
অভিব্যক্তি সমর্থিত নয় ।
সাফারি, ক্রোম, ফায়ারফক্স এবং এজকে সমর্থন করার জন্য এখানে একটি সহজ সংস্করণ
function formDataToJSON(formElement) {
var formData = new FormData(formElement),
convertedJSON = {};
formData.forEach(function(value, key) {
convertedJSON[key] = value;
});
return convertedJSON;
}
সতর্কতা: এই উত্তর IE11 তে কাজ করে না।
ফর্মড্যাটার forEach
আইই 11 তে কোনও পদ্ধতি নেই।
আমি এখনও সমস্ত বড় ব্রাউজারগুলিকে সমর্থন করার জন্য একটি চূড়ান্ত সমাধান অনুসন্ধান করছি।
আপনার যদি নেস্টেড ক্ষেত্রগুলি সিরিয়ালকরণের জন্য সমর্থন প্রয়োজন, যেমন পিএইচপি ক্ষেত্রগুলি হ্যান্ডল করে কীভাবে, আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন
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>
আপনি যদি লোডাশ ব্যবহার করছেন তবে এটি সংক্ষিপ্তভাবে সম্পন্ন করা যেতে পারে fromPairs
import {fromPairs} from 'lodash';
const object = fromPairs(Array.from(formData.entries()));
আপনি এটি চেষ্টা করতে পারেন
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);
}
যদিও @ ডিজুকের উত্তর ইতিমধ্যে খুব ভাল, আপনি আরও কিছুটা মার্জিত করতে আপনি অ্যারে ডিস্ট্রাকচার (আধুনিক ব্রাউজারগুলিতে বা ব্যাবেলের সাথে উপলব্ধ) ব্যবহার করতে পারেন:
// 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),{}));
আশা করি এটি কাউকে সাহায্য করবে।
আমি ফর্মডাটা.জেটএল এর কোনও উল্লেখ দেখিনি পদ্ধতির ।
একটি ফর্মডাটা অবজেক্টের মধ্যে থেকে প্রদত্ত কীটির সাথে সম্পর্কিত সমস্ত মানগুলি ফেরত দেওয়ার পাশাপাশি, অন্যদের দ্বারা নির্দিষ্ট করা হিসাবে 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()
সাহায্য করে? হয়তো আপনি এমন কিছু ঠিক করার চেষ্টা করছেন যা অন্যভাবে করা যেতে পারে?