如何转义 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 和模板文字中的转义变量以将其用作参数
如何解析 JSON 以将其转换为 Swift 中的对象数组?