www urlencoded que form body application javascript json

javascript - que - ¿Cómo convertir una cadena x-www-form-urlencoded a JSON?



x www form urlencoded javascript (8)

Ejemplo de aplicación / x-www-form-urlencoded string

CorrelationId=1&PickedNumbers%5B%5D=1&PickedNumbers%5B%5D=2&PickedNumbers%5B%5D=3&PickedNumbers%5B%5D=4

En JSON

var gamePlayData = { CorrelationId: gameId, PickedNumbers: ["1","2","3","4"] };


Aquí hay una forma pura de JavaScript para hacerlo. Los marcos de JavaScript también pueden ayudarte con esto. EDITAR: Sólo para dar patadas, lancé en el análisis de diccionario, también. Vea 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"}}


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



He estado lidiando con esto recientemente: tuve que analizar datos que podrían contener objetos anidados hasta 5 niveles de profundidad. Necesitaba que el código fuera capaz de tratar con datos bastante complejos, pero no dejé de 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 seguía apareciendo. Dado que recibe 1 vista / día (conceder o recibir), he decidido publicar mi solución aquí, espero que ayude a alguien:

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 siguiente cadena (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";

Lo que retorna cuidadosamente un objeto, que, cuando se pasa a través de JSON.stringify sale así:

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

Pasa una verificación JSlint, al ignorar espacios en blanco,. y [^...] y aceptando ++ . Con todo, lo considero aceptable.



Prueba 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 utilice este (JQuery) http://api.jquery.com/jQuery.param/


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


public static void Main() {

string str = "RESULTADO = 0 & PNREF = A10AABBF8DF2 & RESPMSG = Aprobado & AUTHCODE = 668PNI & PREFPSMSG = No se activaron las reglas & POSTFPSMSG = No se activaron las reglas";

var sr = str.Replace("&", "="); string[] sp = sr.Split(''=''); var spl = sp.Length; int n = 1; var ss = "{"; for (var k = 0; k < spl; k++) { if (n % 2 == 0) { if (n == spl) { ss += ''"'' + sp[k] + ''"''; } else { ss += ''"'' + sp[k] + ''"'' + ","; } } else { ss += ''"'' + sp[k] + ''"'' + ":"; } n++; } ss += "}"; Console.WriteLine(ss); }