读书人

JSON跟byte[]

发布时间: 2012-11-10 10:48:50 作者: rapoo

JSON和byte[]

Json在Ajax中已得到广泛的应用。相比XML,它有如下的优点:

1. 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小;

2. 易于解析这种语言, 客户端Javascript可以简单的通过eval()进行JSON数据的读取;

3. 支持多种语言, 包括Actionscript, C, C#, ColdFusion, Java, Javascript, Perl, PHP, Python, Ruby等语言服务器端语言, 便于服务器端的解析;

4. 在PHP世界, 已经有PHP-JSON和JSON-PHP出现了, 便于PHP序列化后的程序直接调用. PHP服务器端的对象、数组等能够直接生JSON格式, 便于客户端的访问提取。

除了BS模式,CS模式自然也可以使用JSON的格式。毕竟,我们可以简单的将其视为一个hashmap。那么,与一般的传送byte[]方式比较,JSON的优劣又体现在哪里?

带宽算劣势么?直接的JSON文本显然比byte[]占用更多空间,但JSON的格式在传送时候是压缩的,会不会有改善?

解析。JSON对多种语言提供了支持,便于解析。而python的pack和unpack风格,需要我们在各种语言中自行构建代码来支持。

 

这是一个java对python的struct.unpack的模拟。当然,经过改良,我们可以相信其可以具有更好的可读性。类似如下的形式:

String rule = "4!i1!i1!i…"

至少在基本类型的处理上,我认为此形式可以很好的表达CS两端通信的接口。视此rule,则通信规则已了然于心。

需要注意的地方在与‘变长’和‘复杂类型’。

当传递一个变长字符串。可能需要如下的结构:

Len+Body

这样让我们的rule写起来就会费事。又如传递一个未知size的List,也是一个难处理的任务。

下面有一个简单的例子。Server端用python接收数据,以unpack方式接收数据,并以MysqlDB插入Mysql数据库;Client端用Erlang发送数据,以list_to_binary发送数据。

 

很明显Python本身的基础unpack在解决一些复杂问题时候力有不逮。struct模块允许创建一个等效于C结构的字符串,可以读写那些非Python程序生成的二进制文件。或者用于不同程序的网络通信。

在其他语言中,我们完全可以为变长类型和复杂类型定义新的标示,如“2X”,或者“nList”等等。

总而言之,JSON系列和byte[]系列的处理,进过一些考虑和工具类的构建,应该为各自找到较合适的应用场景。

读书人网 >JavaScript

热点推荐