Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JavaScript对象转换为高效查询字符串/URL的算法_Javascript_Typescript_Serialization_Query String - Fatal编程技术网

将JavaScript对象转换为高效查询字符串/URL的算法

将JavaScript对象转换为高效查询字符串/URL的算法,javascript,typescript,serialization,query-string,Javascript,Typescript,Serialization,Query String,上下文:我一直在构建一个创建和使用磁铁链接的应用程序。我一直在试图找到一种有效的方法来在Querystring中传输javascript对象,以便在另一方面,我可以将其反序列化为保持相同类型的对象。我的意思是使用尽可能少的字符/传输尽可能多的数据。我发现我的应用程序在url中最多有+-1500个字符 起初,我使用了最初的Querystring npm包,但这些包可以在反序列化时更改类型,在更深层的对象上也非常低效 例如: 然后,我尝试对QueryString使用json字符串化(带base64和

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

起初,我使用了最初的Querystring npm包,但这些包可以在反序列化时更改类型,在更深层的对象上也非常低效

例如:

然后,我尝试对QueryString使用json字符串化(带base64和不带base64)。但这让我在大部分时间里都有更大的字符串用于简单对象

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
我一直在用谷歌搜索一个有效的算法,但还没有找到一个好的解决方案。我一直在研究msgPack二进制序列化,到那时我还必须使用base64,它可能以更长的字符串结尾

对于静态类型的对象到查询字符串序列化,是否有一种已知的更有效的算法?还是我必须自己创造

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

  • 查询字符串顺序很重要,下一点:
  • 关键点从开始。显示深度:?obj&.property=“test”={obj:{property:“test”}
  • 字符串中的第一个字符定义了它的类型:b=布尔值,s=字符串,n=数字(如果需要,等等)

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

将字符串化对象粘贴到单个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));

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

为什么不将其作为查询字符串的属性插入?所有escped?您说过您的应用程序创建并使用磁铁链接。磁铁链接不就是一个简单的链接吗?这听起来像是一个常规字符串,而不是Javascript对象。另外,您能否澄清您试图序列化的对象的深度级别?或者你不知道他们可能会有多深?我已经更新了我的问题,使之更清楚。我已经尝试过这个ofc,但它留下了一个巨大的查询字符串,其中所有json字符被编码为3个字符(例如:%22=3个字符)
var url = 'http://example.com/query?key=' + encodeURIComponent(JSON.stringify(object));