【问题标题】:Algorithm to turn JavaScript object into efficient query string/urls将 JavaScript 对象转换为高效查询字符串/url 的算法
【发布时间】:2018-02-02 20:51:14
【问题描述】:

上下文:我一直在构建一个创建和使用磁力链接的应用程序。我一直在尝试找到一种有效的方法来传输 Querystring 中的 javascript 对象,以便另一方面我可以将其反序列化为保持相同类型的对象。高效我的意思是使用尽可能少的字符/尽可能多地传输数据。我发现我的应用程序在 url 中最多包含 +-1500 个字符。

起初我使用原始的 Querystring npm 包,但这些包可以在反序列化时更改类型,并且在更深层次的对象上效率也非常低。

例如:

var input = { age: 12, name:'piet'};
var qs = querystring.encode(input); // ?age=12&name=piet
var output querystring.decode(qs); // {age: '12', name: 'piet'

然后我尝试使用带和不带base64 的json 字符串化查询字符串。但这给我留下了大部分时间用于简单对象的更大字符串。

var input = { age: 12, name:'piet'};
var qs = encodeURIComponent(JSON.stringify(input)); // "%7B%22age%22%3A12%2C%22name%22%3A%22piet%22%7D"

但这给我留下了可笑的长查询字符串,因为一半的字符被编码并变成了 3 倍长,这几乎是长度的两倍。

base64 编码在这种情况下是一个更好的解决方案:

var input = { age: 12, name:'piet'};
var qs = btoa(JSON.stringify(input)); // eyJhZ2UiOjEyLCJuYW1lIjoicGlldCJ9

我一直在尝试在 Google 上寻找一种有效的算法,但还没有真正找到一个好的解决方案。我一直在研究 msgPack 二进制序列化,那时我还必须使用 base64,它可能以更长的字符串结尾。

对于静态类型的 Querystring 序列化对象,是否有已知更有效的算法?还是我必须自己创建?

我一直在考虑一个简单的查询字符串算法,其工作原理如下:

  • 查询字符串顺序很重要,下一点:
  • 键以 .显示深度: ?obj&.property="test" = {​​ obj : {property: "test" }}
  • 字符串中的第一个字符定义了它的类型:b=boolean, s=string,n=number, (如果需要,等等)

我认为这将导致更有效的查询字符串。但我不是在构建以前已经做过的东西吗?

【问题讨论】:

  • 你为什么不只是JSON.stringify 并将其作为查询字符串的一些属性粘贴?全部转义?
  • 您说您的应用程序创建并使用磁力链接。磁力链接不就是hashed pointer to a file吗?这听起来只是一个常规字符串,而不是 Javascript 对象。您还可以澄清您尝试序列化的对象的深度级别吗?还是您不提前知道它们可能有多深?

标签: javascript typescript serialization query-string


【解决方案1】:

确定将字符串化对象粘贴到单个 URI 值中应该可以吗?

var test = { string: 'string', integer: 8, intarray: [1,2,3] };

encodeURIComponent(JSON.stringify(test))
// "%7B%22string%22%3A%22string%22%2C%22integer%22%3A8%2C%22intarray%22%3A%5B1%2C2%2C3%5D%7D"

JSON.parse(decodeURIComponent("%7B%22string%22%3A%22string%22%2C%22integer%22%3A8%2C%22intarray%22%3A%5B1%2C2%2C3%5D%7D")
// {string: "string", integer: 8, intarray: [1, 2, 3]}

最后解析的对象与开头输入的对象类型相同。

只需将您的对象粘贴到一个键中:

var url = 'http://example.com/query?key=' + encodeURIComponent(JSON.stringify(object));

对吗?在服务器上,您只需将该单个值解析为一个对象。

【讨论】:

  • 我已经更新了我的问题,使其更加清晰。我已经尝试过这个 ofc,但它给你留下了这个庞大的查询字符串,其中 al json 字符被编码为 3 个字符(例如:%22 = 3 个字符)
猜你喜欢
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2014-12-02
  • 1970-01-01
  • 2016-10-01
相关资源
最近更新 更多