70 votes

Convertir un objet JavaScript en une chaîne de caractères codée en URI

J'ai obtenu un objet JavaScript que j'aimerais récupérer x-www-form-urlencoded .

Quelque chose comme $('#myform').serialize() mais pour les objets.

L'objet suivant :

{
    firstName: "Jonas",
    lastName: "Gauffin"
}

serait encodé en :

firstName=Jonas&lastName=Gauffin (veuillez noter que les caractères spéciaux doivent être encodés correctement)

0 votes

Demandé auparavant : stackoverflow.com/questions/3848340/

0 votes

Veuillez fournir un exemple d'entrée et de sortie. Si vous souhaitez simplement encoder du JSON, encodeURIComponent(json) devrait suffire.

76voto

tipster Points 511

Je suis surpris que personne n'ait mentionné URLSearchParams

var prms = new URLSearchParams({
  firstName: "Jonas",
  lastName: "Gauffin"
});
console.log(prms.toString());
// firstName=Jonas&lastName=Gauffin

3 votes

Ce devrait être la réponse acceptée. Sachez simplement que cela ne fonctionne pas encore dans IE. Vérifiez CanIUse pour savoir si cela a changé : caniuse.com/#search=URLSearchParams

0 votes

Soyons réalistes : nos grands-mères qui utilisent encore IE ne rencontreraient jamais d'applications aussi sophistiquées.

65voto

Grallen Points 176

Regardez attentivement à la fois Les réponses que je fournis ici vous permettront de déterminer ce qui vous convient le mieux.


Réponse 1 :

Probablement ce dont vous avez besoin : Préparer un JSON à utiliser dans une URL en tant qu'argument unique, pour un décodage ultérieur.

jsfiddle

encodeURIComponent(JSON.stringify({"test1":"val1","test2":"val2"}))+"<div>");

Résultat :

%7B%22test%22%3A%22val1%22%2C%22test2%22%3A%22val2%22%7D

Pour ceux qui veulent simplement une fonction pour le faire :

function jsonToURI(json){ return encodeURIComponent(JSON.stringify(json)); }

function uriToJSON(urijson){ return JSON.parse(decodeURIComponent(urijson)); }

Réponse 2 :

Utilise un JSON comme source de paires clé-valeur pour x-www-form-urlencoded de la production.

jsfiddle

// This should probably only be used if all JSON elements are strings
function xwwwfurlenc(srcjson){
    if(typeof srcjson !== "object")
      if(typeof console !== "undefined"){
        console.log("\"srcjson\" is not a JSON object");
        return null;
      }
    u = encodeURIComponent;
    var urljson = "";
    var keys = Object.keys(srcjson);
    for(var i=0; i <keys.length; i++){
        urljson += u(keys[i]) + "=" + u(srcjson[keys[i]]);
        if(i < (keys.length-1))urljson+="&";
    }
    return urljson;
}

// Will only decode as strings
// Without embedding extra information, there is no clean way to
// know what type of variable it was.
function dexwwwfurlenc(urljson){
    var dstjson = {};
    var ret;
    var reg = /(?:^|&)(\w+)=(\w+)/g;
    while((ret = reg.exec(urljson)) !== null){
        dstjson[ret[1]] = ret[2];
    }
    return dstjson;
}

22voto

Claymore Points 1

Puisque vous demandiez un objet sérialisé, c'est probablement un peu à côté de la plaque. Mais juste au cas où, si votre intention est d'utiliser les valeurs de cet objet comme des paramètres individuels, cela pourrait être la conversion que vous recherchez :

var params = {
    "param1": "arg1",
    "param2": "arg2"
};
var query = "";
for (key in params) {
    query += encodeURIComponent(key)+"="+encodeURIComponent(params[key])+"&";
}
xmlhttp.send(query);

0 votes

C'est une bonne chose en théorie, mais le seul problème est qu'il y aura toujours un "&" à la fin. J'ai utilisé une méthode très similaire, mais à la place j'ai défini des valeurs de tableau, et ensuite j'ai utilisé join("&") . Fonctionne bien.

22voto

jb10210 Points 800

Véase jQuery.param(...) . Convertit en uri, voir le lien pour plus d'informations !

4voto

tarkabak Points 141

Une extension de la réponse 1 de @Grallen - si vous avez besoin d'une URL plus courte :

Entrée :

{"q":"SomethingTM","filters":[{"kind":"A","q":"foobar"},{"kind":"B","isntIt":true}],"pagenumber":1}

Sortie :

('q'~'SomethingTM'_'filters'~!('kind'~'A'_'q'~'foobar')_('kind'~'B'_'isntIt'~true)*_'pagenumber'~1)

Au lieu de :

%7B%22q%22%3A%22SomethingTM%22%2C%22filters%22%3A%5B%7B%22kind%22%3A%22A%22%2C%22q%22%3A%22foobar%22%7D%2C%7B%22kind%22%3A%22B%22%2C%22isntIt%22%3Atrue%7D%5D%2C%22pagenumber%22%3A1%7D

function jsonToUri(v, r, s) {
  return encodeURIComponent(
    JSON.stringify(v, r, s)
    .replace(/[()'~_!*]/g, function(c) {
      // Replace ()'~_!* with \u0000 escape sequences
      return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4)
    })
    .replace(/\{/g, '(')    //    { -> (
    .replace(/\}/g, ')')    //    } -> )
    .replace(/"/g,  "'")    //    " -> '
    .replace(/\:/g, '~')    //    : -> ~
    .replace(/,/g,  '_')    //    , -> _
    .replace(/\[/g, '!')    //    [ -> !
    .replace(/\]/g, '*')    //    ] -> *
  )
}

function uriToJson(t, r) {
  return JSON.parse(
    decodeURIComponent(t)
    .replace(/\(/g, '{')    //    ( -> {
    .replace(/\)/g, '}')    //    ) -> }
    .replace(/'/g,  '"')    //    ' -> "
    .replace(/~/g,  ':')    //    ~ -> :
    .replace(/_/g,  ',')    //    _ -> ,
    .replace(/\!/g, '[')    //    ! -> [
    .replace(/\*/g, ']')    //    * -> ]
    , r
  )
}

//////// TESTS ////////

var a = {q: 'SomethingTM', filters: [{kind: 'A', q: 'foobar'}, {kind: 'B', isntIt: true}], pagenumber: 1}
var b = jsonToUri(a)
var c = uriToJson(b)

console.log(b)
// ('q'~'SomethingTM'_'filters'~!('kind'~'A'_'q'~'foobar')_('kind'~'B'_'isntIt'~true)*_'pagenumber'~1)

console.log(JSON.stringify(c))
// {"q":"SomethingTM","filters":[{"kind":"A","q":"foobar"},{"kind":"B","isntIt":true}],"pagenumber":1}

var a2 = {"q":"Something(TM)","filters":[{"kind":"A*","q":"foo_bar"},{"kind":"B!","isn'tIt":true}],"page~number":1}
var b2 = jsonToUri(a2)
var c2 = uriToJson(b2)

console.log(b2)
// ('q'~'Something%5Cu0028TM%5Cu0029'_'filters'~!('kind'~'A%5Cu002a'_'q'~'foo%5Cu005fbar')_('kind'~'B%5Cu0021'_'isn%5Cu0027tIt'~true)*_'page%5Cu007enumber'~1)

console.log(JSON.stringify(c2))
// {"q":"Something(TM)","filters":[{"kind":"A*","q":"foo_bar"},{"kind":"B!","isn'tIt":true}],"page~number":1}

Prograide.com

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.

Powered by:

X