2011-01-12 20 views

risposta

1

Prova this->

// convert string to object 
str = 'a=6&id=99'; 
var arr = str.split('&'); 
var obj = {}; 
for(var i = 0; i < arr.length; i++) { 
    var bits = arr[i].split('='); 
    obj[bits[0]] = bits[1]; 
} 
//alert(obj.a); 
//alert(obj.id); 

// convert object back to string 
str = ''; 
for(key in obj) { 
    str += key + '=' + obj[key] + '&'; 
} 
str = str.slice(0, str.length - 1); 
alert(str); 

Oppure utilizzare questo (JQuery) http://api.jquery.com/jQuery.param/

+1

jQuery.param fa serializzazione - e la questione era di circa inversa operazione. –

4

il seguente codice dovrebbe fare il trucco:

var str = 'CorrelationId=1&PickedNumbers%5B%5D=1&PickedNumbers%5B%5D=2&PickedNumbers%5B%5D=3&PickedNumbers%5B%5D=4'; 
var keyValuePairs = str.split('&'); 
var json = {}; 
for(var i=0,len = keyValuePairs.length,tmp,key,value;i <len;i++) { 
    tmp = keyValuePairs[i].split('='); 
    key = decodeURIComponent(tmp[0]); 
    value = decodeURIComponent(tmp[1]); 
    if(key.search(/\[\]$/) != -1) { 
     tmp = key.replace(/\[\]$/,''); 
     json[tmp] = json[tmp] || []; 
     json[tmp].push(value); 
    } 
    else { 
     json[key] = value; 
    } 
} 
1

Ecco un modo puro JavaScript per farlo. Anche i framework JavaScript potrebbero aiutarti. EDIT: Solo per i calci, ho gettato anche l'analisi del dizionario. Vedi il 2 ° esempio.

function decodeFormParams(params) { 
    var pairs = params.split('&'), 
     result = {}; 

    for (var i = 0; i < pairs.length; i++) { 
    var pair = pairs[i].split('='), 
     key = decodeURIComponent(pair[0]), 
     value = decodeURIComponent(pair[1]), 
     isArray = /\[\]$/.test(key), 
     dictMatch = key.match(/^(.+)\[([^\]]+)\]$/); 

    if (dictMatch) { 
     key = dictMatch[1]; 
     var subkey = dictMatch[2]; 

     result[key] = result[key] || {}; 
     result[key][subkey] = value; 
    } else if (isArray) { 
     key = key.substring(0, key.length-2); 
     result[key] = result[key] || []; 
     result[key].push(value); 
    } else { 
     result[key] = value; 
    } 
    } 

    return result; 
} 

decodeFormParams("CorrelationId=1&PickedNumbers%5B%5D=1&PickedNumbers%5B%5D=2&PickedNumbers%5B%5D=3&PickedNumbers%5B%5D=4"); 
// => {"CorrelationId":"1","PickedNumbers":["1","2","3","4"]} 

decodeFormParams("a%5Bb%5D=c&a%5Bd%5D=e"); 
// => {"a":{"b":"c","d":"e"}} 
7

che ho avuto a che fare con questo recente: ho dovuto analizzare i dati che potrebbero contenere oggetti nidificati fino a 5 livelli di profondità. Avevo bisogno che il codice fosse in grado di gestire sia dati piuttosto complessi, ma non riuscisse a decodificare un URI semplice come id=213.

Ho trascorso un po 'di tempo su google, cercando di trovare una soluzione (semi) elegante a questo problema e questa domanda continuava a essere mostrata. Dal momento che ottiene 1 visita/giorno (più o meno) ho deciso di postare la mia soluzione qui, spero che aiuta qualcuno:

function form2Json(str) 
{ 
    "use strict"; 
    var obj,i,pt,keys,j,ev; 
    if (typeof form2Json.br !== 'function') 
    { 
     form2Json.br = function(repl) 
     { 
      if (repl.indexOf(']') !== -1) 
      { 
       return repl.replace(/\](.+?)(,|$)/g,function($1,$2,$3) 
       { 
        return form2Json.br($2+'}'+$3); 
       }); 
      } 
      return repl; 
     }; 
    } 
    str = '{"'+(str.indexOf('%') !== -1 ? decodeURI(str) : str)+'"}'; 
    obj = str.replace(/\=/g,'":"').replace(/&/g,'","').replace(/\[/g,'":{"'); 
    obj = JSON.parse(obj.replace(/\](.+?)(,|$)/g,function($1,$2,$3){ return form2Json.br($2+'}'+$3);})); 
    pt = ('&'+str).replace(/(\[|\]|\=)/g,'"$1"').replace(/\]"+/g,']').replace(/&([^\[\=]+?)(\[|\=)/g,'"&["$1]$2'); 
    pt = (pt + '"').replace(/^"&/,'').split('&'); 
    for (i=0;i<pt.length;i++) 
    { 
     ev = obj; 
     keys = pt[i].match(/(?!:(\["))([^"]+?)(?=("\]))/g); 
     for (j=0;j<keys.length;j++) 
     { 
      if (!ev.hasOwnProperty(keys[j])) 
      { 
       if (keys.length > (j + 1)) 
       { 
        ev[keys[j]] = {}; 
       } 
       else 
       { 
        ev[keys[j]] = pt[i].split('=')[1].replace(/"/g,''); 
        break; 
       } 
      } 
      ev = ev[keys[j]]; 
     } 
    } 
    return obj; 
} 

ho provato, con i dati come la stringa qui sotto (4 livelli di profondità):

str = "id=007&name[first]=james&name[last]=bond&name[title]=agent&personalia[occupation]=spy&personalia[strength]=women&personalia[weakness]=women&tools[weapons][close][silent]=garrot&tools[weapons][medium][silent]=pistol_supressed&tools[weapons][medium][loud]=smg&tools[weapons][far][silent]=sniper&tools[movement][slow]=foot&tools[movement][far]=DBS"; 

che restituisce ordinatamente un oggetto, che, una volta passato attraverso JSON.stringify viene fuori in questo modo:

{"id":"007","name":{"title":"agent","first":"james","last":"bond"},"personalia":{"weakness":"women","occupation":"spy","strength":"women"},"tools":{"movement":{"far":"DBS","slow":"foot"},"weapons":{"close":{"silent":"garrot"},"medium":{"silent":"pistol_supressed","loud":"smg"},"far":{"silent":"sniper"}}}} 

Si passa un assegno JSLint, quando si ignora lo spazio bianco, . e [^...] e accettando ++. Tutto sommato, lo considererei accettabile.

7

È possibile utilizzare qs se si utilizza il nodo o browserify.

var qs = require('qs') 
var encodedString = "CorrelationId=1&PickedNumbers%5B%5D=1&PickedNumbers%5B%5D=2&PickedNumbers%5B%5D=3&PickedNumbers%5B%5D=4" 

console.log(qs.parse(encodedString)) 
// { CorrelationId: '1', PickedNumbers: [ '1', '2', '3', '4' ] } 
Problemi correlati