是否有不受JSON限制的JavaScript对象文本解析器/编码器?
那么在这里的"讨论"之后, 是否有一个不受JSON限制的JavaScript对象文本解析器/解码器 编辑 在我最初的帖子中,我确实声明我使用Java后端。我给它贴上了.net标签,因为我来自.net背景,可以利用他们的支持——事实证明这是正确的。他们知道我在说什么,以及这两种语言之间的所有移植——我希望听到一些新的东西 Java后端既需要读取这个JSON的“轻”版本,也需要提供它。 所以它既是解析器又是编码器。(我修正了标题名,抱歉混淆)你所说的“在属性名上带有引号的滥用肛门的东西”,是Douglas Crockford做出的一项决定的结果,该决定大大简化了JSON格式,并使编写JSON解析器变得更加容易 记住,在JavaScript中,对象键不能命名为:break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、,throw、true、try、typeof、var、void、while、with和yield,除非它们被引用 此外,任何不是有效JavaScript标识符的键都必须被引用 当您实现“较少分析”的JavaScript对象文本编码器和解析器时,请记住为它们设置例外,否则您甚至不会有有效的JavaScript对象文本 更新: 如果您不想在密钥中使用引号,因为您非常关心使用引号的网络流量开销,因此您宁愿使用自己的类似JSON的编码器和解析器,而不使用引号,而不是使用标准和经过测试的JSON库(我从您的评论中了解到)那么可能您首先不应该使用JSON 也许可以尝试一些二进制格式,如(RFC 3072–结构化数据交换格式)或(二进制JSON,一种类似JSON文档的二进制编码序列化),或者使用您自己的二进制格式,因为从JSON中删除引号不会走多远(对于Gzip传输,最多可能是1%) 更新2: 如果我正确理解了您的情况,那么您有如下JSON数据:是否有不受JSON限制的JavaScript对象文本解析器/编码器?,java,javascript,json,Java,Javascript,Json,那么在这里的"讨论"之后, 是否有一个不受JSON限制的JavaScript对象文本解析器/解码器 编辑 在我最初的帖子中,我确实声明我使用Java后端。我给它贴上了.net标签,因为我来自.net背景,可以利用他们的支持——事实证明这是正确的。他们知道我在说什么,以及这两种语言之间的所有移植——我希望听到一些新的东西 Java后端既需要读取这个JSON的“轻”版本,也需要提供它。 所以它既是解析器又是编码器。(我修正了标题名,抱歉混淆)你所说的“在属性名上带有引号的滥用肛门的东西”,是Dou
[{"a":1,"b":2,"c":3,"d":4},null,null,{"a":9,"b":10,"c":11,"d":12}]
它是66字节。将其转换为纯JavaScript对象文字可能是:
[{a:1,b:2,c:3,d:4},,,{a:9,b:10,c:11,d:12}]
现在是42字节。(请记住,浏览器之间悬空逗号的处理是不一致的,例如,[1,2,,]
在Firefox中是4元素数组,在IE中可能是5元素数组。)
但这不是你能做的一切。可以删除对象中的冒号、大括号和逗号:
a1b2c3d4,,,a9b10c11d12
现在是22字节。它大约是不带引号的版本的一半,和带引号的版本的三分之一,并且仍然很容易解析。如果您有一个扁平的数据结构,那么它可能适合您。我将把我刚刚发明的用于紧凑平面对象表示法的新格式称为CFON
您可以使用如下代码将其转换为JSON:
var inp = input.split(','),
out = [], i, j, m, p, output;
for (i = 0; i < inp.length; i++) {
if (inp[i]) {
out[i] = {};
m = inp[i].match(/[a-z]+\d+/ig);
for (j = 0; j < m.length; j++) {
p = /([a-z]+)(\d+)/i.exec(m[j]);
out[i][p[1]] = p[2];
}
}
}
output = JSON.stringify(out);
var inp = JSON.parse(input),
out = [], i, k, output;
for (i = 0; i < inp.length; i++) {
out[i] = '';
if (inp[i]) {
for (k in inp[i]) {
if (inp[i].hasOwnProperty(k)) {
out[i] += k + inp[i][k];
}
}
}
}
output = out.join(',');
var inp=input.split(','),
out=[],i,j,m,p,输出;
对于(i=0;i
看
您可以使用如下代码将JSON转换为这种小格式:
var inp = input.split(','),
out = [], i, j, m, p, output;
for (i = 0; i < inp.length; i++) {
if (inp[i]) {
out[i] = {};
m = inp[i].match(/[a-z]+\d+/ig);
for (j = 0; j < m.length; j++) {
p = /([a-z]+)(\d+)/i.exec(m[j]);
out[i][p[1]] = p[2];
}
}
}
output = JSON.stringify(out);
var inp = JSON.parse(input),
out = [], i, k, output;
for (i = 0; i < inp.length; i++) {
out[i] = '';
if (inp[i]) {
for (k in inp[i]) {
if (inp[i].hasOwnProperty(k)) {
out[i] += k + inp[i][k];
}
}
}
}
output = out.join(',');
var inp=JSON.parse(输入),
out=[],i,k,输出;
对于(i=0;i
看
现在我正在考虑它,我可能会添加对小数的支持,并制作一个CFON库。如果有人感兴趣,请评论
无论如何,这仍然只是一种文本格式。如果你使用二进制,你会得到更好的结果,特别是对于大数。此外,如果您有一个预定义键列表,那么很容易为每个键使用数字。如果键是数字,值是数字,那么二进制文件就可以非常紧凑。我建议这样做如何?你检查过了吗?它很震撼,但我有一个Java团队在另一端:(那么为什么这个问题仍然用
.net
标记?你应该明确地声明你正在寻找一个Java JSON序列化程序并重新标记你的问题。(实际上我猜是“解析器/解码器”这个术语)可能意味着您想要反序列化JSON。人们可能会想,为什么您首先会得到不正确的JSON,因为生成它比解析它简单得多。)YAML是JSON的一种超集,它(至少有时)不需要在属性名周围加引号。如果是我,我只需要编写自己的JSON解析器;这是一种非常简单的语法,拥有自己的语法可以更轻松地处理对象实例化(在解码过程中)以满足您的应用程序需要。这一点很好(投票结果:)。由于我所有的属性名称都是预定义的(没有一个是关键字),我想我将使用更定制的指定版本。但我希望我能有一个好的开始来扩展,而不是从零开始。。。然而,简化JSON解析的决定帮助JSON发展起来,但我认为现在JSON已经存在了,它应该继续前进,接受现在的条件——障碍不是解析,而是网络。@Radagast:我只是好奇,您的数据看起来如何?引用密钥会在网络流量中产生如此大的差异,以至于您愿意使用自己的编码滚动您自己的格式