Cómo convertir FormData (objeto HTML5) a JSON

Resuelto Leonardo Villela asked hace 7 años • 36 respuestas

¿ Cómo convierto las entradas de un FormDataobjeto HTML5 a JSON?

La solución no debería utilizar jQuery. Además, no debería simplemente serializar todo el FormDataobjeto, sino solo sus entradas clave/valor.

Leonardo Villela avatar Jan 03 '17 01:01 Leonardo Villela
Aceptado

También puedes usar forEachen el FormDataobjeto 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 FormDataobjeto 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 stringifymé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 toJSONmé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.

Wilt avatar Oct 16 '2017 15:10 Wilt

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 : FormDatapuede 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.

hakatashi avatar Apr 26 '2019 19:04 hakatashi