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

Posted

技术标签:

【中文标题】如何转义 JSON 字符串以将其包含在 URL 中?【英文标题】:How to escape a JSON string to have it in a URL? 【发布时间】:2011-10-12 00:57:06 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

另见***.com/questions/21802866/… 【参考方案1】:
encodeURIComponent(JSON.stringify(object_to_be_serialised))

【讨论】:

它似乎编码了比必要更多的字符(当我在 Firefox 中粘贴链接时,一些字符被还原(即[")。有没有办法只编码必要的字符,这样我就可以缩短我的网址?【参考方案2】:

使用encodeURIComponent()

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

德兰给出的答案是完美的。只需添加它 - 以防有人想要命名参数或单独传递多个 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 注入等)【参考方案5】:

我也想做同样的事情。对我来说问题是我的网址太长了。我今天找到了使用Bruno Jouhier's jsUrl.js library 的解决方案。

我还没有对它进行过彻底的测试。但是,这里有一个示例,显示了使用 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 库似乎使用了 Object.keys、Array.map 和 Array.filter 等 ECMAScript 5 函数。因此,它只适用于现代浏览器(即 8 及以下)。但是,这些函数的 polyfill 是否可以使其与更多浏览器兼容。

对于数组:https://***.com/a/2790686/467286 对于 object.keys:https://***.com/a/3937321/467286

【讨论】:

从 0.1.4 开始,如果您仍然需要这些,它也与 IE 6-8 兼容。【参考方案6】:

我会提供一个古怪的选择。有时使用不同的编码会更容易,特别是如果您正在处理各种系统,这些系统并不都以相同的方式处理 URL 编码的细节。这不是最主流的方法,但在某些情况下可以派上用场。

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

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"

相同,base64 编码:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"

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

【讨论】:

终于在这里找到了我朋友(&)的地址(%26) base64 字符串的问题是它们可以包含斜杠 (/) 字符,这会使 url 无效... 没错,但您可以选择要在 base64 中使用的字符:将 / 替换为 $_ 或任何其他不需要根据 RFC 3986 进行 url 编码的字符。跨度>

以上是关于如何转义 JSON 字符串以将其包含在 URL 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何从函数返回(bigint,双精度)数组以将其转换为json数组

Angular - JSX 和模板文字中的转义变量以将其用作参数

url传参包含json

如何解析 JSON 以将其转换为 Swift 中的对象数组?

如何在 iOS 字符串中禁用或绕过 Base64 图像 url 数据的转义序列

如何加载 JSON 数据以将其与 select2 插件一起使用