Cómo convertir FormData (objeto HTML5) a JSON
¿ Cómo convierto las entradas de un FormData
objeto HTML5 a JSON?
La solución no debería utilizar jQuery. Además, no debería simplemente serializar todo el FormData
objeto, sino solo sus entradas clave/valor.
También puedes usar forEach
en el FormData
objeto directamente:
var object = {};
formData.forEach(function(value, key){
object[key] = value;
});
var json = JSON.stringify(object);
ACTUALIZAR:
Y para aquellos que prefieren la misma solución con las funciones de flecha de ES6 :
var object = {};
formData.forEach((value, key) => object[key] = value);
var json = JSON.stringify(object);
ACTUALIZACIÓN 2:
Y para aquellos que desean soporte para listas de selección múltiple u otros elementos de formulario con múltiples valores (dado que hay tantos comentarios debajo de la respuesta sobre este problema, agregaré una posible solución) :
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);
Aquí un Fiddle que demuestra el uso de este método con una simple lista de selección múltiple.
ACTUALIZACIÓN 3:
Como nota al margen para quienes terminan aquí; en caso de que el propósito de convertir los datos del formulario a json sea enviarlos a través de un XMLHttpRequest a un servidor, puede enviar el FormData
objeto directamente sin convertirlo. Tan simple como esto:
var request = new XMLHttpRequest();
request.open('POST', 'http://example.com/submitform.php');
request.send(formData);
Consulte también Uso de objetos FormData en MDN como referencia .
O, alternativamente, puedes hacer lo mismo con la API Fetch moderna :
fetch('http://example.com/submitform.php', {
method: 'POST',
body: formData
}).then((response) => {
// do something with response here...
});
Consulte también Uso de Fetch API en MDN como referencia .
ACTUALIZACIÓN 4:
Como se menciona en uno de los comentarios debajo de mi respuesta, el stringify
método JSON no funcionará de inmediato para todo tipo de objetos. Para obtener más información sobre qué tipos son compatibles, me gustaría consultar la sección Descripción en la documentación de MDNJSON.stringify
.
En la descripción también se menciona que:
Si el valor tiene un método toJSON(), es responsable de definir qué datos se serializarán.
Esto significa que puede proporcionar su propio toJSON
método de serialización con lógica para serializar sus objetos personalizados. De esta manera, puede crear rápida y fácilmente soporte de serialización para árboles de objetos más complejos.
En 2019, este tipo de tarea se volvió muy fácil.
JSON.stringify(Object.fromEntries(formData));
Object.fromEntries
: Compatible con Chrome 73+, Firefox 63+, Safari 12.1
Como se menciona en los comentarios, tenga en cuenta : FormData
puede contener varios valores con la misma clave (por ejemplo, casillas de verificación con el mismo nombre). Object.fromEntries()
descarta los duplicados y solo conserva el último.