Ajax 如何使JSON不那么冗长?

Ajax 如何使JSON不那么冗长?,ajax,string,json,serialization,Ajax,String,Json,Serialization,我目前正在开发一个web应用程序,并将JSON用于ajax请求和响应。我有一个区域,我以超过10000个对象的数组的形式向客户机返回一个非常大的数据集。下面是示例的一部分(它被简化了一些): 您可以想象,这个数组中有大量的对象,JSON响应的大小可能相当大 我的问题是,是否有一个JSON字符串生成器/解析器可以将“schedules”数组转换为JSON字符串: "schedules": [ ["codePractice", "codeScheduleObject", "codeLogin

我目前正在开发一个web应用程序,并将JSON用于ajax请求和响应。我有一个区域,我以超过10000个对象的数组的形式向客户机返回一个非常大的数据集。下面是示例的一部分(它被简化了一些):

您可以想象,这个数组中有大量的对象,JSON响应的大小可能相当大

我的问题是,是否有一个JSON字符串生成器/解析器可以将
“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)));