将JSON转换为uri编码的字符串

我有一个JSON / javascript对象,我想获得x-www-form-urlencoded

类似于$('#myform').serialize()但对于对象。

以下对象:

 { firstName: "Jonas", lastName: "Gauffin" } 

将被编码为:

firstName=Jonas&lastName=Gauffin (请注意特殊字符应该正确编码)

请仔细查看我在这里提供的两个答案,以确定最适合您的答案。


答案1:

您可能需要的东西:将要在URL中使用的JSON作为单个参数进行准备,以便以后解码。

的jsfiddle

 encodeURIComponent(JSON.stringify({"test1":"val1","test2":"val2"}))+"
");

结果:

 %7B%22test%22%3A%22val1%22%2C%22test2%22%3A%22val2%22%7D 

对于那些只想要一个函数的人来说:

 function jsonToURI(json){ return encodeURIComponent(JSON.stringify(json)); } function uriToJSON(urijson){ return JSON.parse(decodeURIComponent(urijson)); } 

答案2:

使用JSON作为x-www-form-urlencoded输出的键值对的来源。

的jsfiddle

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

请参阅jQuery.param(...) 。 转换为uri,请参阅链接以获取更多信息!

既然你要求一个序列化的对象,这可能稍微偏离了标记。 但为了以防万一,如果您的意图是将该对象中的值用作单个参数,这可能是您正在寻找的转换:

 var params = { "param1": "arg1", "param2": "arg2" }; var query = ""; for (key in params) { query += encodeURIComponent(key)+"="+encodeURIComponent(params[key])+"&"; } xmlhttp.send(query); 

@ Grallen答案1的扩展 – 如果您需要更短的url:

输入:

 {"q":"SomethingTM","filters":[{"kind":"A","q":"foobar"},{"kind":"B","isntIt":true}],"pagenumber":1} 

输出:

 ('q'~'SomethingTM'_'filters'~!('kind'~'A'_'q'~'foobar')_('kind'~'B'_'isntIt'~true)*_'pagenumber'~1) 

代替:

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

仅供参考,接受的答案不包括对嵌套对象的支持。 这是您可以实现此目的的一种方法:

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

您需要使用JSON.stringify()来序列化JSON / JavaScript对象。

它几乎在所有现代浏览器中都可以使用,但是你可以包含下面的js,这将添加所需的库,因为它不可用。

http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js