¿Cómo convertir un objeto FormData HTML5 a JSON? Sin Jquery y manejando propiedades anidadas en FormData como un objeto.
javascript
form-data
Leonardo Villela
fuente
fuente
JSON.stringify()
Ayuda? ¿Quizás intentas arreglar algo que se puede hacer de otra manera?Respuestas:
También puede utilizar
forEach
en elFormData
objeto directamente:ACTUALIZAR:
Y para aquellos que prefieren la misma solución con las funciones de flecha ES6 :
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 con respecto a este problema, agregaré una posible solución) :
Aquí un violín demuestra el uso de este método con una lista de selección múltiple simple.
ACTUALIZACIÓN 3:
Como nota al margen para aquellos que terminan aquí, en caso de que el propósito de convertir los datos del formulario a json sea enviarlos a través de una solicitud HTTP XML a un servidor, puede enviar el
FormData
objeto directamente sin convertirlo. Tan simple como esto:Consulte también Uso de objetos FormData en MDN como referencia :
ACTUALIZACIÓN 4:
Como se menciona en uno de los comentarios a continuación, mi respuesta, el
stringify
método JSON no funcionará de inmediato para todos los tipos 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 MDN deJSON.stringify
.En la descripción también se menciona que:
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 soporte de serialización rápida y fácilmente para árboles de objetos más complejos.fuente
<SELECT MULTIPLE>
y<INPUT type="checkbox">
con el mismo nombre, convirtiendo el valor en una matriz.JSON.stringify(Object.fromEntries(formData));
es mucho mejorEn 2019, este tipo de tarea se volvió súper fácil.
Object.fromEntries
: Compatible con Chrome 73+, Firefox 63+, Safari 12.1fuente
<select multiple>
o<input type="checkbox">
😞JSON.stringify(Object.fromEntries(formData.entries()));
He aquí una forma de hacerlo con un estilo más funcional, sin el uso de una biblioteca.
Ejemplo:
fuente
Si tiene varias entradas con el mismo nombre, por ejemplo, si utiliza
<SELECT multiple>
o tiene varias<INPUT type="checkbox">
con el mismo nombre, debe ocuparse de eso y hacer una matriz del valor. De lo contrario, solo obtendrá el último valor seleccionado.Aquí está la variante moderna ES6:
Código un poco más antiguo (pero aún no es compatible con IE11, ya que no es compatible
ForEach
oentries
noFormData
)fuente
Puede lograr esto utilizando FormData () objeto . Este objeto FormData se completará con las claves / valores actuales del formulario utilizando la propiedad de nombre de cada elemento para las claves y su valor enviado para los valores. También codificará el contenido de entrada del archivo.
Ejemplo:
fuente
for (const [key, value] of formData.entries())
Función fácil de usar
He creado una función para esto
Ejemplo de uso
En este código, he creado una variable JSON vacía usando el
for
bucle que he usadokey
s de formData Object a JSON Keys en cada iteración.Encuentra este código en mi biblioteca JS en GitHub, sugiéreme si necesita una mejora. He colocado el código aquí https://github.com/alijamal14/Utilities/blob/master/Utilities.js
fuente
<select multiple>
o<input type="checkbox">
.Esta publicación ya tiene un año ... pero, realmente, me gusta mucho la respuesta de ES6 @dzuc. Sin embargo, está incompleto al no poder manejar múltiples selecciones o casillas de verificación. Esto ya se ha apuntado y se han ofrecido soluciones de código. Los encuentro pesados y no optimizados. Entonces escribí 2 versiones basadas en @dzuc para manejar estos casos:
Versión Hotshot de una línea:
[]
sufijo.Versión Hotshot de una línea:
Desde la última vez que escribí el segundo caso anterior, en el trabajo surgió un caso en el que el formulario PHP tiene casillas de verificación en varios niveles. Escribí un nuevo caso para respaldar el caso anterior y este. Creé un fragmento para mostrar mejor este caso, el resultado se muestra en la consola para esta demostración, modifíquelo según sus necesidades. Traté de optimizarlo lo mejor que pude sin comprometer el rendimiento, sin embargo, comprometió la legibilidad humana. Se aprovecha que las matrices son objetos y las variables que apuntan a matrices se mantienen como referencia. No hay pez gordo para este, sea mi invitado.
fuente
Array.from(fd).reduce((obj, [k, v]) => ({...obj, [k]: v}), {});
Hotshot versión es2018El método FormData
.entries
y lafor of
expresión no son compatibles con IE11 y Safari.Aquí hay una versión más simple para admitir Safari, Chrome, Firefox y Edge
Advertencia: esta respuesta no funciona en IE11.
FormData no tiene un
forEach
método en IE11.Todavía estoy buscando una solución final que sea compatible con los principales navegadores.
fuente
Si está usando lodash, puede hacerlo de forma concisa con
fromPairs
fuente
Si necesita soporte para serializar campos anidados, similar a cómo PHP maneja los campos de formulario, puede usar la siguiente función
fuente
Puedes probar esto
fuente
Aunque la respuesta de @dzuc ya es muy buena, puede usar la desestructuración de matrices (disponible en navegadores modernos o con Babel) para hacerlo aún un poco más elegante:
fuente
¡Una sola línea abusiva!
¡Hoy aprendí que Firefox tiene soporte para propagación de objetos y desestructuración de matrices!
fuente
Si los siguientes elementos satisfacen sus necesidades, está de suerte:
[['key','value1'], ['key2','value2']
(como lo que FormData le da) en un objeto clave-> valor como{key1: 'value1', key2: 'value2'}
y convertirlo en una cadena JSON.Aquí está el código que necesitará:
Espero que esto ayude a alguien.
fuente
No he visto menciones de FormData.getAllHasta ahora método .
Además de devolver todos los valores asociados con una clave dada desde dentro de un objeto FormData, se vuelve realmente simple usar el método Object.fromEntries como lo especifican otros aquí.
Fragmento en acción
fuente
Trabajó para mi
fuente
<select multiple>
o<input type="checkbox">
En mi caso, los datos del formulario eran datos, la base de fuego esperaba un objeto, pero los datos contienen el objeto y todas las demás cosas, así que probé data.value, ¡funcionó!
fuente
Llego tarde aquí. Sin embargo, hice un método simple que busca el tipo de entrada = "casilla de verificación"
Espero que esto ayude a alguien más.
fuente
Puede hacer este trabajo fácilmente sin usar nada especial. Un código como el siguiente será suficiente.
fuente