如何转义JSON字符串以将其包含在URL中?


128

我想使用Javascript生成指向页面的链接。该页面的参数位于我以JSON序列化的Javascript数组中。

所以我想生成一个这样的URL:

http://example.com/?data="MY_JSON_ARRAY_HERE"

我该如何转义JSON字符串(序列化的数组)以将其作为参数包含在URL中?

如果有使用JQuery的解决方案,我会喜欢的。

注意:是的,页面的参数必须位于数组中,因为它们很多。我想我以后将使用bit.ly缩短链接。


Answers:


209
encodeURIComponent(JSON.stringify(object_to_be_serialised))

10
似乎它编码的字符超过了必要的字符(当我在Firefox中粘贴链接时,某些字符被还原回(即{[")。有没有办法只编码必要的字符,以便我可以缩短网址?
Matthieu Napoli

19

您可以使用encodeURIComponent来对查询字符串的一部分进行安全的URL编码:

var array = JSON.stringify([ 'foo', 'bar' ]);
var url = 'http://example.com/?data=' + encodeURIComponent(array);

或者,如果您将其作为AJAX请求发送:

var array = JSON.stringify([ 'foo', 'bar' ]);
$.ajax({
    url: 'http://example.com/',
    type: 'GET',
    data: { data: array },
    success: function(result) {
        // process the results
    }
});

19

我一直想做同样的事情。我的问题是我的网址太长了。我今天使用Bruno Jouhier的jsUrl.js库找到了一个解决方案

我还没有对它进行彻底的测试。但是,以下示例显示了使用3种不同方法对相同的大对象进行编码后输出的字符串的字符长度:

  • 2651个字符使用 jQuery.param
  • 1691个字符使用 JSON.stringify + encodeURIComponent
  • 821个字符使用 JSURL.stringify

显然,JSURL具有用于urlEncoding js对象的最优化的格式。

https://groups.google.com/forum/?fromgroups=#!topic/nodejs/ivdZuGCF86Q上的线程 显示了编码和解析的基准。

注意:经过测试,jsurl.js库似乎使用了ECMAScript 5函数,例如Object.keys,Array.map和Array.filter。因此,它仅适用于现代浏览器(不支持8及以下版本)。但是,这些功能的polyfill将使其与更多浏览器兼容。


从0.1.4开始,如果您仍然需要IE 6-8,它也与IE 6-8兼容。
Stoffe

8

使用encodeURIComponent()

var url = 'index.php?data='+encodeURIComponent(JSON.stringify({"json":[{"j":"son"}]})),

5

我将提供一个替代方案。有时使用不同的编码会更容易,尤其是当您要处理的系统不能完全以相同的方式处理URL编码的详细信息时。这不是最主流的方法,但是在某些情况下可以派上用场。

您可以对数据进行base64编码,而不是对数据进行URL编码。这样做的好处是,编码数据非常通用,仅包含字母字符,有时包含尾随=。例:

JSON字符串数组:

["option", "Fred's dog", "Bill & Trudy", "param=3"]

将该数据编码为data参数的URL :

"data=%5B%27option%27%2C+%22Fred%27s+dog%22%2C+%27Bill+%26+Trudy%27%2C+%27param%3D3%27%5D"

相同,以base64编码:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"

base64方法可以更短一些,但更重要的是它更简单。通常由于引号,嵌入式%符号等原因,我经常在cURL,Web浏览器和其他客户端之间移动URL编码的数据时遇到问题。Base64是非常中性的,因为它不使用特殊字符。


终于在这里找到了我朋友(&)的地址(%26)
Pradeep Kumar Prabaharan

base64字符串的问题是它们可以包含斜杠(/)字符,这会使url无效...
ingbabic

这是事实,但你可以选择用base64使用字符:替换/$_或者做其他任何字符不要求每个RFC 3986. url编码
克里斯-约翰逊

0

Delan给出的答案是完美的。只需添加它-万一有人要命名参数或分别传递多个JSON字符串-以下代码可能会有所帮助!

jQuery查询

var valuesToPass = new Array(encodeURIComponent(VALUE_1), encodeURIComponent(VALUE_2), encodeURIComponent(VALUE_3), encodeURIComponent(VALUE_4));

data = {elements:JSON.stringify(valuesToPass)}

的PHP

json_decode(urldecode($_POST('elements')));

希望这可以帮助!


无需对PHP $ _POST或任何其他(GET,REQEST等)中的urldecode()数据进行编码。根据您今后的工作,可能会遇到安全问题(SQL注入等)
Tit Petric,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.