J'ai une chaîne de caractères comme celle-ci :
abc=foo&def=%5Basf%5D&xyz=5
Comment puis-je le convertir en un objet JavaScript comme celui-ci ?
{
abc: 'foo',
def: '[asf]',
xyz: 5
}
J'ai une chaîne de caractères comme celle-ci :
abc=foo&def=%5Basf%5D&xyz=5
Comment puis-je le convertir en un objet JavaScript comme celui-ci ?
{
abc: 'foo',
def: '[asf]',
xyz: 5
}
Cette édition améliore et explique la réponse en se basant sur les commentaires.
var search = location.search.substring(1);
JSON.parse('{"' + decodeURI(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')
Exemple
Analyser abc=foo&def=%5Basf%5D&xyz=5
en cinq étapes :
abc=foo","def=[asf]","xyz=5
abc":"foo","def":"[asf]","xyz":"5
{"abc":"foo","def":"[asf]","xyz":"5"}
qui est un JSON légal.
Un site solution améliorée permet d'utiliser plus de caractères dans la chaîne de recherche. Il utilise une fonction reviver pour le décodage des URI :
var search = location.search.substring(1);
JSON.parse('{"' + search.replace(/&/g, '","').replace(/=/g,'":"') + '"}', function(key, value) { return key===""?value:decodeURIComponent(value) })
Exemple
search = "abc=foo&def=%5Basf%5D&xyz=5&foo=b%3Dar";
donne
Object {abc: "foo", def: "[asf]", xyz: "5", foo: "b=ar"}
Une seule phrase :
JSON.parse('{"' + decodeURI("abc=foo&def=%5Basf%5D&xyz=5".replace(/&/g, "\",\"").replace(/=/g,"\":\"")) + '"}')
Pour que cela fonctionne en CoffeeScript, échappez le '=' dans l'expression rationnelle. .replace(/\=/g,"\":\"")
Merci pour la réponse. Peut-être qu'expliquer ce que fait chaque partie aiderait certaines personnes à mieux comprendre plutôt que de simplement copier+coller+espérer que ça marche. - Laissons les "one liners" aux minifieurs :)
Split on &
pour obtenir des paires nom/valeur, puis diviser chaque paire sur =
. Voici un exemple :
var str = "abc=foo&def=%5Basf%5D&xy%5Bz=5"
var obj = str.split("&").reduce(function(prev, curr, i, arr) {
var p = curr.split("=");
prev[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
return prev;
}, {});
Une autre approche, l'utilisation d'expressions régulières :
var obj = {};
str.replace(/([^=&]+)=([^&]*)/g, function(m, key, value) {
obj[decodeURIComponent(key)] = decodeURIComponent(value);
});
Ceci est adapté du livre de John Resig "Cherchez et ne remplacez pas" .
N'avez-vous pas oublié de désencoder la chaîne pour convertir les %5B et %5D en caractères ?
@Alex - Avez-vous utilisé le code mis à jour ou l'original ? L'original avait un problème et une faute de frappe.
Il ne peut pas gérer correctement les paramètres lorsque leurs valeurs contiennent '='. Il réduit les valeurs au premier '='.
J'ai trouvé $.String.deparam la solution préconstruite la plus complète (peut faire des objets imbriqués, etc.). Consultez le site documentation .
Je signale simplement que si votre entrée doit toujours être une chaîne de requête sérialisée, il n'est pas nécessaire de s'inquiéter de l'imbrication et une solution plus légère est probablement préférable.
À ma connaissance, il n'existe pas de solution native. Dojo a une méthode de désérialisation intégrée si vous utilisez ce framework par hasard.
Sinon, vous pouvez le mettre en œuvre vous-même assez simplement :
function unserialize(str) {
str = decodeURIComponent(str);
var chunks = str.split('&'),
obj = {};
for(var c=0; c < chunks.length; c++) {
var split = chunks[c].split('=', 2);
obj[split[0]] = split[1];
}
return obj;
}
edit : ajouté decodeURIComponent()
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Voir aussi stackoverflow.com/questions/901115/
1 votes
Ce n'est pas le cas : developer.mozilla.org/fr/US/docs/Web/API/URLSearchParams/ developer.mozilla.org/fr/US/docs/Web/API/URL/ (mais il faudra attendre encore un peu pour que tous les navigateurs le captent).