Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.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
是否有不受JSON限制的JavaScript对象文本解析器/编码器?_Java_Javascript_Json - Fatal编程技术网

是否有不受JSON限制的JavaScript对象文本解析器/编码器?

是否有不受JSON限制的JavaScript对象文本解析器/编码器?,java,javascript,json,Java,Javascript,Json,那么在这里的"讨论"之后, 是否有一个不受JSON限制的JavaScript对象文本解析器/解码器 编辑 在我最初的帖子中,我确实声明我使用Java后端。我给它贴上了.net标签,因为我来自.net背景,可以利用他们的支持——事实证明这是正确的。他们知道我在说什么,以及这两种语言之间的所有移植——我希望听到一些新的东西 Java后端既需要读取这个JSON的“轻”版本,也需要提供它。 所以它既是解析器又是编码器。(我修正了标题名,抱歉混淆)你所说的“在属性名上带有引号的滥用肛门的东西”,是Dou

那么在这里的"讨论"之后,

是否有一个不受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数据:

[{"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:我只是好奇,您的数据看起来如何?引用密钥会在网络流量中产生如此大的差异,以至于您愿意使用自己的编码滚动您自己的格式