perl6 JSON::Fast模块json解析的使用

关于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/

时间: 2024-12-20 18:35:43

perl6 JSON::Fast模块json解析的使用的相关文章

Python 基础 - Day 4 Learning Note - 模块 - Json &amp; Pickle

Json和Pickle的区别 在python的序列化的两个模块中,json模块是用于字符串和python数据类型间进行转换:另一个pickle模块,是用于python特有的类型(所有数据类型和python的数据类型间进行转换.json是可以在不同语言之间交换数据的,而pickle只在python之间使用.json只能序列化最基本的数据类型,json只能把常用的数据类型序列化(列表.字典.列表.字符串.数字.),比如日期格式.类对象!josn就不行了.而pickle可以序列化所有的数据类型,包括类

python 模块-json

1.JSON(Javascript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集.JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl,Python等).这些特性使JSON

perl6 HTTP::UserAgent (3) JSON

如果一个 URL 要求POST数据是 JSON格式的, 那我们要怎么发送数据呢? 第一种: HTTP::Request 上一篇说到, 发送 POST 数据, 可以: 1. $ua.post(url, %data) 2. $request.add-form-data(%data) $ua.request($request) 在这里, 无论是第一种方法还是第二种方法, 里面所发送的 %data 都会自动编码. JSON也是一种字符串格式, 这两种方法要求%data为一个hash, 那就说明这两种方法

常用模块(json/pickle/shelve/XML)

一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将硬盘上存储的中间格式数据在还原为内存中的数据结构 为什么要序列化? 1.持久保持状态 2.跨平台数据的交互 JSON是什么? java script object notation 就是对象表示法 var obj = {"name":"egon"} 对于我们开发而言 j

python json,pickle模块

json模块 不同语言间的数据交互 eval方法可以将一个字符串转成python对象,但eval方法是有局限性,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型(函数.类等)的时候,eval就不管用了,因此eval通常用来执行一个字符串表达式,并返回表达式的值. dic='{"name":"alex"}' f=open('hello','w') f.write(dic) #eval方法将字符串转换为python的数据类型 f_read=ope

python开发模块基础:序列化模块json,pickle,shelve

一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来.但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中.你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?没错序列化的过程就是从dic 变成str(dic)的

序列化的两个模块(json和pickle)

到底什么是序列化(picking)呢? 我们把变量从内存中变成可存储或传输的过程称之为序列化 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling json和pickle json和pickle模块,两个都是用于序列化的模块 json #json 是通用的,可以在各种语言里进行交互,只是一个简单的序列化方法#json把python对象转化成字符串,仅限于简单的数据类型,例如列表,字典,元组

JSON格式之GSON解析

JSON格式之GSON解析 最近在做websocket相关,项目需要JSON解析.相较之下感觉google的GSON解析不错. JAVA后台 Gson提供了fromJson()方法来实现从Json相关对象到java实体的方法 1.对象类型 采用上图的第一种方法. Gson gson =new Gson(); User user= gson.fromJson(str, User.class); 2.Map.List等 采用上图的第二种方法. Type type = new TypeToken<Ma

模块 json,sys,pickle,logging

sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 ========================================================sys.argv de 作用 返回的命令是列表,通过列表把用户名和密码直接赋值 -------------------------------------sys.pat