关于JSON:
JSON (JavaScript Object Notation)是一种轻量级的数据交换格式,语法简单,各种语言都有相应的库或者模块支持。
因为JSON非常小巧,解析起来又非常简单,我经常会把配置文件组织成JSON格式。
关于JSON::Fast:
在http://modules.perl6.org/上的介绍:A naive, but hopefully fast json parser; drop-in replacement for JSON::Tiny
一个单纯的,快速的JSON解析器;为了替代JSON::Tiny
本来想做一个perl6的ftp自动上传小程序,今天花了半天的时间写了一半,后来才发现perl6没有现成的ftp库,不过在写的过程中了解了JSON::Fast
模块的用法。。还是值得的
JSON::Fast的安装
perl6是使用panda来管理模块的,用panda安装模块和fedora安装软件一样简单,一条命令即可解决
1 panda install JSON::Fast
不知是panda的原因,还是我的问题,panda的反应在我机器上非常慢,虽然我的CPU太烂了点。。
安装好了之后可以使用下面的命令测试一下是否安装成功
perl6 -e "use JSON::Fast"
如果JSON::Fast模块不存在的话,执行会报错
JSON::Fast的使用
首先,我们有一个简单的json文件,sample.json,文件内容如下
{ "user-list":[ "username", "otheruser" ], "username":{ "ip":"192.168.0.100", "port":"21", "pass":"password", "dir":".", "ext":"" }, "otheruser":{...//这里省略一些配置} }
json文件很简单,打算用来做ftp上传小程序的配置文件
首先,新建一个文件叫做fast-json.pl, 写一个MAIN函数,perl6的MAIN函数做的比较强大
1 sub MAIN(Str :c(:$config-file) = "", *@file) { 2 if +@file == 0 { 3 say "No file argument"; 4 return; 5 } 6 }
然后chmod +x fast-json.pl,执行一下./fast-json.pl --help
Usage: ./fast-json.pl [-c|--config-file=<Str>] [<file> ...]
就会像shell里面的命令一样,出现用法提示
解释一下这几行代码,
第一行
sub是函数的开始,或者叫子程序; MAIN是和C语言的main有着相同作用的函数,不过如果定义了MAIN函数会先执行全局的语句然后最后执行MAIN;
Str是perl6中的类型,其他类似的类型还有Int、Bool等等,想获得一个变量的类型,可以使用WHAT方法,例如
say $var.WHAT;
这句话会将$var的类型打印出来;
$config-file代表MAIN函数的第一个参数,配置文件的路径,在变量的前面加上‘:‘,使之成为可变的命名变量,这样就可以作为脚本的一个设置了,前面
的:c代表这个设置的短名称;*@file, @代表数组,*代表将剩下的所有的参数都作为@file数组的成员,由于跟json解析无关就不细说了。。
这样我们可以这么测试了
./fast-json.pl --config-file=users.cfg xxx
users.cfg是json格式的config文件,xxx代表要上传的文件
然后,读取需要解析的json文件的内容
1 my $json-path = IO::Path.new($config-file); 2 3 if (!($json-path.e && $json-path.r)) { 4 say "Config file not exist path -> $json-path"; 5 exit 6 } 7 my $json-slurp = $json-path.slurp();
IO::Path是一个内置的类,有一些文件操作相关的函数
.e .r分别用来判断,文件是否存在,是否可以读取
.slurp是用来读取文件的全部内容
之后就是json文件的解析了,JSON::Fast模块的解析很简单,
1 my $json; 2 3 try { 4 $json = from-json($json-slurp); 5 CATCH { 6 default { 7 "User config has error".say(); 8 "Stack ----->".say(); 9 ... 10 } 11 } 12 }
try{CATCH{}}是perl6中的异常处理,想了解的可以去看perl6的启示录,如果json解析出错,这里就会接收到异常,然后...表示打印出崩溃的栈信息
如果解析成功,$json就代表我们解析完成的json文件了,如果用say打印一下$json.WHAT,你会发现就是一个hash..
然后就是取json的元素,数组
1 my $user-list; 2 3 if $json{‘user-list‘}:exists { 4 $user-list = $json{‘user-list‘}; 5 6 say $user-list.elems; 7 say $user-list[0]; 8 say $user-list[1]; 9 }
第一句检查hash中是否有元素user-list,如果有将元素取出并打印出来
username otheruser
由于是一个数组,可以使用.elems获取数组中元素的个数,使用下标获取单独的一项
然后同样的可以获取元素
1 if $json{$user-list[0]}:exists { 2 my $info = $json{$user-list[0]}; 3 4 say $info{‘ip‘}; 5 }
然后元素的存储还是hash,所以接下来就简单了,像取$json的元素一样取$info的元素即可。。这里的例子会打印出username的ip的值
192.168.0.100
那么,JSON::Fast的解析使用就讲到这里了,具体的使用也可以去JSON::Fast的主页看看
https://github.com/timo/json_fast/