2011-01-12 14 views

Respuesta

1

Pruebe esto:>

// 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); 

O utilizar este (jQuery) http://api.jquery.com/jQuery.param/

+1

jQuery.param hace serialización - y la pregunta era acerca inversa operación. –

4

el siguiente código debería hacer el truco:

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

Aquí hay una forma de JavaScript puro para hacerlo. Los marcos de JavaScript también pueden ayudarte con esto. EDITAR: Solo por las patadas, lancé en el diccionario de análisis, también. Ver el segundo ejemplo.

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

que he estado tratando con esto recientemente: He tenido que analizar los datos que podrían contener objetos anidados hasta 5 niveles de profundidad. Necesitaba el código para poder tratar con datos bastante complejos, pero no para decodificar un URI tan simple como id=213.

Pasé bastante tiempo en google, tratando de encontrar una solución (semi) elegante para este problema, y ​​esta pregunta siguió apareciendo. Ya que se pone 1 Ver/día (más o menos) que he decidido publicar mi solución aquí, espero que ayude a alguien por:

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; 
} 

Lo he probado, con datos como la cadena abajo (4 niveles de profundidad):

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"; 

Qué cuidadosamente devuelve un objeto, que, cuando se pasó a través de JSON.stringify sale como esta:

{"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"}}}} 

Se pasa un cheque JSLint, cuando se ignoran los espacios en blanco, . y [^...] y aceptando ++. En general, lo consideraría aceptable.

7

Puede usar qs si está utilizando node 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' ] }