Ajax 如何使JSON不那么冗长?
我目前正在开发一个web应用程序,并将JSON用于ajax请求和响应。我有一个区域,我以超过10000个对象的数组的形式向客户机返回一个非常大的数据集。下面是示例的一部分(它被简化了一些): 您可以想象,这个数组中有大量的对象,JSON响应的大小可能相当大 我的问题是,是否有一个JSON字符串生成器/解析器可以将Ajax 如何使JSON不那么冗长?,ajax,string,json,serialization,Ajax,String,Json,Serialization,我目前正在开发一个web应用程序,并将JSON用于ajax请求和响应。我有一个区域,我以超过10000个对象的数组的形式向客户机返回一个非常大的数据集。下面是示例的一部分(它被简化了一些): 您可以想象,这个数组中有大量的对象,JSON响应的大小可能相当大 我的问题是,是否有一个JSON字符串生成器/解析器可以将“schedules”数组转换为JSON字符串: "schedules": [ ["codePractice", "codeScheduleObject", "codeLogin
“schedules”
数组转换为JSON字符串:
"schedules": [
["codePractice", "codeScheduleObject", "codeLogin", "codeScheduleObjectType", "defaultCodeScheduleObject","name"],
[35, 576, "", 12, "Dr. 1"],
[35, 169, "", 43, "Dr. 2"],
[35, 959, "", 76, "Dr. 3"],
]
也就是说,在“schedules”
数组的开头会有一个数组,该数组保存该数组中对象的键,而所有其他容器数组都会保存这些值
如果我愿意的话,我可以在服务器上进行转换,然后在客户端对其进行解析,但我想知道是否有一个用于解析/字符串化大型JSON的标准库
我也可以通过一个小型程序运行它,但我想保留我目前拥有的密钥,因为它们在应用程序中提供了一些上下文
我还希望您可以在这里批评我的方法或建议其他方法?在更改JSON模式之前,请尝试一下
HTTP压缩(即gzip或deflate)已经做到了这一点。重复的模式(如JSON键)被替换为令牌,因此每次传输只需出现一次详细模式。这里有一篇文章,它几乎完成了您想要做的事情: 乍一看,在算法的第一步之后,您的示例似乎会压缩为以下内容,这实际上会在后续步骤中做更多的工作): 您已经可以开始看到该算法的好处了。以下是通过压缩机运行后的最终输出:
{
"f" : "cjson",
"t" : [
[0,"schedules"],
[0,"codePractice","codeScheduleObject","codeScheduleObjectType","defaultCodeScheduleObject","name"]
],
"v" : {
"" : [ 1, [
{ "" : [2, 35, 576, "", 12, "Dr. 1"] },
{ "" : [2, 35, 169, "", 43, "Dr. 2"] },
{ "" : [2, 35, 959, "", 76, "Dr. 3"] }
]
]
}
}
如果你有几千条记录,你显然可以看到进步。输出仍然可读,但我认为其他人也是对的:一个好的压缩算法将删除重复的文本块…不是答案,而是根据10k条目的输入和一些虚假数据给出“节省”的粗略估计:-)这是对我发表的评论的回应。增加的复杂性会使模式化方法值得吗 “这要看情况。” 此C#已准备好进行测试/修改:
string LongTemplate (int n1, int n2, int n3, string name) {
return string.Format(@"
{{
""codePractice"": {0},
""codeScheduleObject"": {1},
""codeScheduleObjectType"": """",
""defaultCodeScheduleObject"": {2},
""name"": ""Dr. {3}""
}}," + "\n", n1, n2, n3, name);
}
string ShortTemplate (int n1, int n2, int n3, string name) {
return string.Format("[{0}, {1}, \"\", {2}, \"Dr. {3}\"],\n",
n1, n2, n3, name);
}
string MinTemplate (int n1, int n2, int n3, string name) {
return string.Format("[{0},{1},\"\",{2},\"Dr. {3}\"],",
n1, n2, n3, name);
}
long GZippedSize (string s) {
var ms = new MemoryStream();
using (var gzip = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress, true))
using (var sw = new StreamWriter(gzip)) {
sw.Write(s);
}
return ms.Position;
}
void Main()
{
var r = new Random();
var l = new StringBuilder();
var s = new StringBuilder();
var m = new StringBuilder();
for (int i = 0; i < 10000; i++) {
var n1 = r.Next(10000);
var n2 = r.Next(10000);
var n3 = r.Next(10000);
var name = "bogus" + r.Next(50);
l.Append(LongTemplate(n1, n2, n3, name));
s.Append(ShortTemplate(n1, n2, n3, name));
m.Append(MinTemplate(n1, n2, n3, name));
}
var lc = GZippedSize(l.ToString());
var sc = GZippedSize(s.ToString());
var mc = GZippedSize(s.ToString());
Console.WriteLine(string.Format("Long:\tNormal={0}\tGZip={1}\tCompressed={2:P}", l.Length, lc, (float)lc / l.Length));
Console.WriteLine(string.Format("Short:\tNormal={0}\tGZip={1}\tCompressed={2:P}", s.Length, sc, (float)sc / s.Length));
Console.WriteLine(string.Format("Min:\tNormal={0}\tGZip={1}\tCompressed={2:P}", m.Length, mc, (float)mc / m.Length));
Console.WriteLine(string.Format("Short/Long\tRegular={0:P}\tGZip={1:P}",
(float)s.Length / l.Length, (float)sc / lc));
Console.WriteLine(string.Format("Min/Long\tRegular={0:P}\tGZip={1:P}",
(float)m.Length / l.Length, (float)mc / lc));
}
字符串长模板(int n1、int n2、int n3、字符串名称){
返回string.Format(@)
{{
“codePractice”“:{0},
“codeScheduleObject”“:{1},
“codeScheduleObjectType:”“”,
“defaultCodeScheduleObject”“:{2},
名称:“{3}博士”
}}、“+”\n”、n1、n2、n3、名称);
}
字符串短模板(int n1、int n2、int n3、字符串名称){
返回string.Format(“[{0},{1},\“\”,{2},\“{3}\”],\n”,
n1、n2、n3、名称);
}
字符串MinTemplate(int n1、int n2、int n3、字符串名称){
返回string.Format(“[{0},{1},\”,{2},\“Dr.{3}\”],”,
n1、n2、n3、名称);
}
长gzip大小(字符串s){
var ms=新内存流();
使用(var gzip=new System.IO.Compression.GZipStream(ms,System.IO.Compression.CompressionMode.Compress,true))
使用(var sw=新StreamWriter(gzip)){
软件写入;
}
返回女士位置;
}
void Main()
{
var r=新的随机变量();
var l=新的StringBuilder();
var s=新的StringBuilder();
var m=新的StringBuilder();
对于(int i=0;i<10000;i++){
var n1=r.Next(10000);
var n2=r.Next(10000);
var n3=r.Next(10000);
var name=“伪造”+r.Next(50);
l、 追加(LongTemplate(n1,n2,n3,name));
s、 追加(短模板(n1、n2、n3、名称));
m、 追加(MinTemplate(n1,n2,n3,name));
}
var lc=GZippedSize(l.ToString());
var sc=GZippedSize(s.ToString());
var mc=GZippedSize(s.ToString());
WriteLine(string.Format(“Long:\tNormal={0}\tGZip={1}\t压缩={2:P}”,l.Length,lc,(float)lc/l.Length));
WriteLine(string.Format(“Short:\tNormal={0}\tGZip={1}\tCompressed={2:P}”),s.Length,sc,(float)sc/s.Length);
WriteLine(string.Format(“Min:\tNormal={0}\tGZip={1}\t压缩={2:P}”,m.Length,mc,(float)mc/m.Length));
Console.WriteLine(string.Format(“Short/Long\tRegular={0:P}\tGZip={1:P}”),
(浮子)s.长度/l.长度,(浮子)sc/lc);
Console.WriteLine(string.Format(“Min/Long\tRegular={0:P}\tGZip={1:P}”),
(浮动)米长/l长,(浮动)mc/lc);
}
我的结果:
Long: Normal=1754614 GZip=197053 Compressed=11.23 %
Short: Normal=384614 GZip=128252 Compressed=33.35 %
Min: Normal=334614 GZip=128252 Compressed=38.33 %
Short/Long Regular=21.92 % GZip=65.09 %
Min/Long Regular=19.07 % GZip=65.09 %
长:正常=1754614 GZip=197053压缩=11.23%
短:正常=384614 GZip=128252压缩=33.35%
最小值:正常值=334614 GZip=128252压缩值=38.33%
短/长规则=21.92%GZip=65.09%
最小/长常规=19.07%GZip=65.09%
结论:
- 最大的节约是使用GZIP(比只使用schema'ize更好)
- GZIP+schema’ized将是最小的整体
- 有了GZIP,就没有必要使用普通的JavaScript最小化程序(在这个场景中)
- 使用GZIP(例如放气);它在重复的结构化文本上表现得非常好(正常情况下压缩率为900%)
愉快的编码。请注意,我正是用php编写的。它是数据库中的对象列表
$comp=base64_encode(gzcompress(json_encode($json)));
json:string(22501长度)
gz compressed=string(711),但它是二进制格式
gz compressed+base64=string(948)是一种文本格式
因此,使用几分之一秒的时间,它就相当小了。尝试在服务器上使用gzip功能,甚至尝试用PHP发送gzip JSON响应(当然要用特殊的头发送)。谢谢,但我已经在使用gzip了。我会将模式和数据分开(例如,
{schema:,data:}
),否则我认为它是有效的。我不确定是否有这方面的图书馆。然而,在GZIP之后,它会带来巨大的节约吗?我不确定
Long: Normal=1754614 GZip=197053 Compressed=11.23 %
Short: Normal=384614 GZip=128252 Compressed=33.35 %
Min: Normal=334614 GZip=128252 Compressed=38.33 %
Short/Long Regular=21.92 % GZip=65.09 %
Min/Long Regular=19.07 % GZip=65.09 %
$comp=base64_encode(gzcompress(json_encode($json)));