Comment convertir un objet HTML5 FormData en JSON? Sans Jquery et gestion des propriétés imbriquées dans FormData comme un objet.
javascript
form-data
Léonard de Vinci
la source
la source
JSON.stringify()
aide? Peut-être que vous essayez de réparer quelque chose qui pourrait être fait d'une autre manière?Réponses:
Vous pouvez également utiliser directement
forEach
sur l'FormData
objet:METTRE À JOUR:
Et pour ceux qui préfèrent la même solution avec les fonctions fléchées ES6 :
MISE À JOUR 2:
Et pour ceux qui souhaitent prendre en charge les listes de sélection multiples ou d'autres éléments de formulaire avec plusieurs valeurs (car il y a tellement de commentaires sous la réponse concernant ce problème, j'ajouterai une solution possible) :
Voici un Fiddle démontrant l'utilisation de cette méthode avec une simple liste de sélection multiple.
MISE À JOUR 3:
En guise de note supplémentaire pour ceux qui se retrouvent ici, si le but de la conversion des données du formulaire en json est de l'envoyer via une requête HTTP XML à un serveur, vous pouvez envoyer l'
FormData
objet directement sans le convertir. Aussi simple que ceci:Voir aussi Utilisation d'objets FormData sur MDN pour référence :
MISE À JOUR 4:
Comme mentionné dans l'un des commentaires ci-dessous ma réponse, la
stringify
méthode JSON ne fonctionnera pas hors de la boîte pour tous les types d'objets. Pour plus d'informations sur les types pris en charge, je voudrais consulter la section Description de la documentation MDN deJSON.stringify
.Dans la description, il est également mentionné que:
Cela signifie que vous pouvez fournir votre propre
toJSON
méthode de sérialisation avec une logique de sérialisation de vos objets personnalisés. Ainsi, vous pouvez rapidement et facilement créer une prise en charge de la sérialisation pour des arborescences d'objets plus complexes.la source
<SELECT MULTIPLE>
et<INPUT type="checkbox">
avec le même nom, en convertissant la valeur en tableau.JSON.stringify(Object.fromEntries(formData));
est tellement plus agréableEn 2019, ce genre de tâche est devenu super facile.
Object.fromEntries
: Pris en charge dans Chrome 73+, Firefox 63+, Safari 12.1la source
<select multiple>
ou<input type="checkbox">
😞JSON.stringify(Object.fromEntries(formData.entries()));
Voici une façon de le faire dans un style plus fonctionnel, sans utiliser de bibliothèque.
Exemple:
la source
Si vous avez plusieurs entrées avec le même nom, par exemple si vous utilisez
<SELECT multiple>
ou en avez plusieurs<INPUT type="checkbox">
avec le même nom, vous devez vous en occuper et créer un tableau de la valeur. Sinon, vous n'obtiendrez que la dernière valeur sélectionnée.Voici la variante ES6 moderne:
Code peu plus (mais toujours pas pris en charge par IE11, car il ne supporte pas
ForEach
ouentries
surFormData
)la source
Vous pouvez y parvenir en utilisant l' objet FormData () . Cet objet FormData sera rempli avec les clés / valeurs actuelles du formulaire en utilisant la propriété name de chaque élément pour les clés et leur valeur soumise pour les valeurs. Il encodera également le contenu d'entrée du fichier.
Exemple:
la source
for (const [key, value] of formData.entries())
Fonction facile à utiliser
J'ai créé une fonction pour cela
Exemple d'utilisation
Dans ce code, j'ai créé une variable JSON vide à l'aide d'une boucle.J'ai
for
utilisé deskey
s de l'objet formData aux clés JSON dans chaque Itration.Vous trouvez ce code dans ma bibliothèque JS sur GitHub, suggérez-moi s'il a besoin d'amélioration, j'ai placé le code ici https://github.com/alijamal14/Utilities/blob/master/Utilities.js
la source
<select multiple>
ou<input type="checkbox">
.Ce message a déjà un an ... mais j'aime vraiment beaucoup la réponse ES6 @dzuc. Cependant, il est incomplet car il n'a pas été en mesure de gérer plusieurs sélections ou cases à cocher. Cela a déjà pointé et des solutions de code ont été proposées. Je les trouve lourds et non optimisés. J'ai donc écrit 2 versions basées sur @dzuc pour gérer ces cas:
Version Hotshot une ligne:
[]
suffixe.Version Hotshot une ligne:
Depuis la dernière fois que j'ai écrit le deuxième cas précédent, au travail, il est arrivé que le formulaire PHP ait des cases à cocher sur plusieurs niveaux. J'ai écrit un nouveau cas pour soutenir le cas précédent et celui-ci. J'ai créé un extrait pour mieux mettre en valeur ce cas, le résultat affiché sur la console pour cette démo, modifiez-le selon vos besoins. J'ai essayé de l'optimiser du mieux que je pouvais sans compromettre les performances, mais cela compromettait une certaine lisibilité humaine. Il tire parti du fait que les tableaux sont des objets et que les variables pointant vers des tableaux sont conservées comme référence. Pas de hotshot pour celui-ci, soyez mon invité.
la source
Array.from(fd).reduce((obj, [k, v]) => ({...obj, [k]: v}), {});
hotshot version es2018La méthode FormData
.entries
et l'for of
expression ne sont pas prises en charge dans IE11 et Safari.Voici une version plus simple pour prendre en charge Safari, Chrome, Firefox et Edge
Attention: cette réponse ne fonctionne pas dans IE11.
FormData n'a pas de
forEach
méthode dans IE11.Je suis toujours à la recherche d'une solution finale pour prendre en charge tous les principaux navigateurs.
la source
Si vous utilisez lodash, cela peut être fait de manière concise avec
fromPairs
la source
Si vous avez besoin de support pour la sérialisation des champs imbriqués, de la même manière que PHP gère les champs de formulaire, vous pouvez utiliser la fonction suivante
la source
Vous pouvez essayer ceci
la source
Même si la réponse de @dzuc est déjà très bonne, vous pouvez utiliser la déstructuration des tableaux (disponible dans les navigateurs modernes ou avec Babel) pour le rendre encore un peu plus élégant:
la source
Une doublure abusive!
Aujourd'hui, j'ai appris que Firefox prend en charge la diffusion d'objets et la déstructuration des tableaux!
la source
Si les articles suivants répondent à vos besoins, vous avez de la chance:
[['key','value1'], ['key2','value2']
(comme ce que FormData vous donne) en un objet clé-> valeur comme{key1: 'value1', key2: 'value2'}
et le convertir en une chaîne JSON.Voici le code dont vous aurez besoin:
J'espère que cela aide quelqu'un.
la source
Je n'ai vu aucune mention de la méthode FormData.getAll jusqu'à présent.
En plus de renvoyer toutes les valeurs associées à une clé donnée à partir d'un objet FormData, cela devient vraiment simple en utilisant la méthode Object.fromEntries comme spécifié par d'autres ici.
Extrait en action
la source
A travaillé pour moi
la source
<select multiple>
ou<input type="checkbox">
Dans mon cas, les données étaient des données, la base de feu attendait un objet mais les données contiennent un objet ainsi que tous les autres éléments, alors j'ai essayé data.value, cela a fonctionné !!!
la source
J'arrive tard ici. Cependant, j'ai fait une méthode simple qui vérifie le type d'entrée = "case à cocher"
J'espère que cela aide quelqu'un d'autre.
la source
Vous pouvez faire ce travail facilement sans utiliser quoi que ce soit de spécial. Un code comme celui ci-dessous suffira.
la source