decodeuri - javascript decode unicode string
Convertir JSON en cadena codificada en uri (6)
Tengo un objeto JSON / javascript que me gustaría obtener x-www-form-urlencoded
.
Algo como $(''#myform'').serialize()
pero para objetos.
El siguiente objeto:
{
firstName: "Jonas",
lastName: "Gauffin"
}
sería codificado para:
firstName=Jonas&lastName=Gauffin
(tenga en cuenta que los caracteres especiales deben codificarse correctamente)
Dado que estaba solicitando un objeto serializado, es probable que esto esté ligeramente fuera de lugar. Pero por si acaso, si su intención es usar los valores dentro de ese objeto como parámetros individuales, esta podría ser la conversión que está buscando:
var params = {
"param1": "arg1",
"param2": "arg2"
};
var query = "";
for (key in params) {
query += encodeURIComponent(key)+"="+encodeURIComponent(params[key])+"&";
}
xmlhttp.send(query);
Mire detenidamente las dos respuestas que proporciono aquí para determinar cuál se ajusta mejor a usted.
Respuesta 1:
Probablemente lo que necesita: prepara un JSON para usarlo en una URL como un único argumento, para su posterior decodificación.
encodeURIComponent(JSON.stringify({"test1":"val1","test2":"val2"}))+"<div>");
Resultado:
%7B%22test%22%3A%22val1%22%2C%22test2%22%3A%22val2%22%7D
Para aquellos que solo quieren una función para hacerlo:
function jsonToURI(json){ return encodeURIComponent(JSON.stringify(json)); }
function uriToJSON(urijson){ return JSON.parse(decodeURIComponent(urijson)); }
Respuesta 2:
Utiliza un JSON como fuente de pares de valores clave para la salida x-www-form-urlencoded
.
// 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;
}
Para su información, la respuesta aceptada no incluye soporte para objetos anidados. Aquí hay una forma en que puedes lograr esto:
function xwwwfurlenc(srcjson, parent=""){
if(typeof srcjson !== "object")
if(typeof console !== "undefined"){
console.log("/"srcjson/" is not a JSON object");
return null;
}
let u = encodeURIComponent;
let urljson = "";
let keys = Object.keys(srcjson);
for(let i=0; i < keys.length; i++){
let k = parent ? parent + "[" + keys[i] + "]" : keys[i];
if(typeof srcjson[keys[i]] !== "object"){
urljson += u(k) + "=" + u(srcjson[keys[i]]);
} else {
urljson += xwwwfurlenc(srcjson[keys[i]], k)
}
if(i < (keys.length-1))urljson+="&";
}
return urljson;
}
Una extensión de la respuesta 1 de @ Grallen: si necesita una URL más corta:
Entrada:
{"q":"SomethingTM","filters":[{"kind":"A","q":"foobar"},{"kind":"B","isntIt":true}],"pagenumber":1}
Salida:
(''q''~''SomethingTM''_''filters''~!(''kind''~''A''_''q''~''foobar'')_(''kind''~''B''_''isntIt''~true)*_''pagenumber''~1)
En lugar 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}
Ver jQuery.param(...)
. Se convierte a uri, ver enlace para más información!
JSON.stringify()
usar JSON.stringify()
para serializar el objeto JSON / JavaScript.
Está disponible de forma nativa en casi todos los navegadores modernos, pero puede incluir los siguientes js que agregarán la biblioteca requerida en caso de que no esté disponible.