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;
}
}
Este es un módulo central de Node.js ahora: https://nodejs.org/api/querystring.html#querystring_querystring_parse_str_sep_eq_options
var qs = require(''querystring'')
var json = qs.parse(''why=not&sad=salad'')
// { why: ''not'', sad: ''salad'' }
También funciona con caracteres codificados:
var json2 = qs.parse(''http%3A%2F%2Fexample.com&sad=salad'')
// { url: ''http://example.com'', sad: ''salad'' }
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.
Necesitas lo contrario de jQuery.param. Una de las opciones es http://benalman.com/code/projects/jquery-bbq/examples/deparam/
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);
}