如何转义一个 JSON 字符串使其在 URL 中?

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

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

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

我需要如何转义我的 JSON 字符串(序列化的数组)来将它作为一个参数包含在 URL 中?

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

注意: 是的,页面的参数需要在一个数组中,因为有很多这样的参数。我想之后我会用 bit.ly 来缩短链接。

211466 次浏览
encodeURIComponent(JSON.stringify(object_to_be_serialised))

使用 encodeURIComponent():

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

您可以使用 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
}
});

德兰给出的答案是完美的。只是添加到它-如果有人想命名参数或传递多个 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')));

希望这个能帮上忙!

我也想这么做。问题是我的网址太长了。我今天用 Bruno Jouhier 的 jsUrl.js 库找到了一个解决方案。

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

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

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

这个帖子的 https://groups.google.com/forum/?fromgroups=#!topic/nodejs/ivdzugcf86q 是: http://groups.google.com/forum/? from groups = # ! subject/nodejs/ivdZugCF86Q”rel = “ noReferrer”> 显示编码和解析的基准。

注意 : 测试之后,jsurl.js 库似乎使用了 ECMAScript 5函数,比如 Object.keys、 Array.map 和 Array.filter。因此,它只能在现代浏览器上工作(不包括8和8以下版本)。但是,这些函数的填充是否可以使其与更多的浏览器兼容。

我会给你另一个选择。有时,使用完全不同的编码更容易,特别是如果您正在处理各种各样的系统,这些系统并不都以相同的方式处理 URL 编码的细节。

而不是 URL 编码的数据,您可以 base64编码它。这样做的好处是,编码的数据是非常通用的,只包含字母字符,有时还包含后面的 =字符。例如:

JSON 字符串数组:

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

这些数据,URL 编码为 data参数:

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

一样,基本编码64:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"

Base64方法可以稍微短一点,但更重要的是它更简单。我经常在 cURL、 Web 浏览器和其他客户端之间移动 URL 编码的数据时遇到问题,通常是由于引号、嵌入的 %标志、通配符的 shell 扩展等原因。Base64是非常中立和非常可移植的,因为它的输出中没有特殊字符。

许多系统使用这种方法。例如,在 Kubernetes 生态系统中,kubectl edit secret代表 base64中的所有秘密,以避免编码问题,并使不可打印的二进制数据易于复制和粘贴。