是否存在没有JSON限制的JavaScript对象文字的解析器/编码器?

时间:2011-03-12 12:04:20

标签: java javascript json

嗯,按照这里的“讨论”:

https://stackoverflow.com/questions/5281903/java-json-parsers-whats-the-abusive-anal-thing-with-the-quote-marks-on-attribu

是否存在没有JSON限制的JavaScript对象文字的解析器/解码器?

修改

在我的原始帖子中,我确实说过我使用Java后端。我将它标记为.net,因为我来自.net背景并且可以使用他们的支持 - 事实证明它是正确的。他们知道我在说什么,以及两种语言之间的所有移植 - 我希望听到一些新的东西。

Java后端需要同时阅读这个“轻”版本的JSON,并提供它。 所以它既是Parser也是Encoder。 (我修改了标题名称,sory为混乱)

1 个答案:

答案 0 :(得分:8)

你称之为“在属性名称上引用标记的滥用肛门”是道格拉斯·克罗克福德决定大大简化JSON格式并编写JSON解析器的结果更容易

请记住,在JavaScript中,您不能将对象键命名为:break,case,catch,class,const,continue,debugger,default,delete,do,else,enum,export,extends,false,finally,for ,函数,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标识符的密钥。

当您实现“less anal”JavaScript对象文字编码器和解析器时,请记住为它们制作例外,否则您甚至不会拥有有效的JavaScript对象文字

更新

如果您不想在密钥中使用引号,因为您非常关心使用引号的网络流量开销,那么您宁愿滚动自己的类似JSON的编码器和解析器,而不是使用引号而不是使用标准和经过测试的JSON库(我从你的评论中理解)然后可能你不应该首先使用JSON

也许尝试一些二进制格式,如SDXF(RFC 3072 - 结构化数据交换格式)或BSON(二进制JSON,类似JSON文档的二进制编码序列化)或滚动自己的< strong>二进制格式,因为从JSON中删除引号不会占用太多(对于最多gzipped传输可能只有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);

请参阅CFON→JSON DEMO

你可以使用以下代码将JSON转换为这种小格式:

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(',');

请参阅JSON→CFON DEMO

现在我正在思考它,我可能会添加对小数部分的支持并创建一个CFON库。如果有人有兴趣请发表评论。

无论如何,这仍然只是一种文本格式。如果你去二进制,你会得到更好的结果,特别是对于大数字。此外,如果您有一个预定义键列表,那么很容易为每个键使用数字。如果键是数字而值是数字,则二进制可以非常紧凑。