Rad*_*own 3 javascript java json
那么,在这里的"讨论"之后:
有没有JSON限制的JavaScript对象文字的解析器/解码器?
编辑
在我的原始帖子中,我确实声明我使用Java后端.我将它标记为.net,因为我来自.net背景并且可以使用他们的支持 - 事实证明它是正确的.他们知道我在说什么,以及两种语言之间的所有移植 - 我希望听到一些新的东西.
Java后端需要读取这个"轻"版本的JSON,并提供它.所以它既是Parser也是Encoder.(我修改了标题名称,sory为混乱)
你称之为"在属性名称上引用标记的滥用肛门"是道格拉斯·克罗克福德决定大大简化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,除非他们被引用,否则和收益率.
此外,任何不是有效JavaScript标识符的密钥都必须引用.
当您实现"less anal"JavaScript对象文字编码器和解析器时,请记住为它们制作例外,否则您甚至不会拥有有效的JavaScript对象文字.
如果您不想在密钥中使用引号,因为您非常关心使用引号的网络流量开销,那么您宁愿滚动自己的JSON类编码器和解析器,它们不会使用引号而不是使用标准并且测试了JSON库(我从你的评论中理解)然后你可能不应该首先使用JSON.
也许尝试一些二进制格式,如SDXF(RFC 3072 - 结构化数据交换格式)或BSON(二进制JSON,类似JSON文档的二进制编码序列化)或滚动您自己的二进制格式,因为从JSON删除引号不会带你到远(gzipped转移最多可能是1%).
如果我理解你的情况,那么你有这样的JSON数据:
[{"a":1,"b":2,"c":3,"d":4},null,null,{"a":9,"b":10,"c":11,"d":12}]
Run Code Online (Sandbox Code Playgroud)
这是66个字节.将它转换为纯JavaScript对象文字可能是:
[{a:1,b:2,c:3,d:4},,,{a:9,b:10,c:11,d:12}]
Run Code Online (Sandbox Code Playgroud)
它现在是42个字节.(请记住,悬挂逗号的处理在浏览器之间是不一致的 - 例如,Firefox中[1,,2,,]的4元素数组和IE中的5元素数组.)
但这不是你能做的一切.您可以删除对象中的冒号,花括号和逗号:
a1b2c3d4,,,a9b10c11d12
Run Code Online (Sandbox Code Playgroud)
现在是22个字节.它大约有一半的版本没有引号,三分之一的版本带引号,它仍然很容易解析.如果你有一个扁平的数据结构,那么它可能没问题.我将这种新格式称为我刚刚发明的CFON for Compact Flat Object Notation.
您可以使用以下代码将其转换为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);
Run Code Online (Sandbox Code Playgroud)
您可以使用以下代码将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(',');
Run Code Online (Sandbox Code Playgroud)
请参阅JSON→CFON DEMO.
现在我正在考虑它,我可能会添加对小数部分的支持并创建一个CFON库.如果有人有兴趣请评论.
无论如何,这仍然只是一种文本格式.如果你去二进制,你会得到更好的结果,特别是对于大数字.此外,如果您有一个预定义键列表,那么很容易为每个键使用数字.如果键是数字而值是数字,则二进制可以非常紧凑.
| 归档时间: |
|
| 查看次数: |
875 次 |
| 最近记录: |