关于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安装软件一样简单,一条命令即可解决
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函数做的比较强大
sub MAIN(Str :c(:$config-file) = "", *@file) {
if +@file == {
say "No file argument";
return;
}
}
然后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文件的内容
my $json-path = IO::Path.new($config-file); if (!($json-path.e && $json-path.r)) {
say "Config file not exist path -> $json-path";
exit
}
my $json-slurp = $json-path.slurp();
IO::Path是一个内置的类,有一些文件操作相关的函数
.e .r分别用来判断,文件是否存在,是否可以读取
.slurp是用来读取文件的全部内容
之后就是json文件的解析了,JSON::Fast模块的解析很简单,
my $json; try {
$json = from-json($json-slurp);
CATCH {
default {
"User config has error".say();
"Stack ----->".say();
...
}
}
}
try{CATCH{}}是perl6中的异常处理,想了解的可以去看perl6的启示录,如果json解析出错,这里就会接收到异常,然后...表示打印出崩溃的栈信息
如果解析成功,$json就代表我们解析完成的json文件了,如果用say打印一下$json.WHAT,你会发现就是一个hash..
然后就是取json的元素,数组
my $user-list; if $json{'user-list'}:exists {
$user-list = $json{'user-list'}; say $user-list.elems;
say $user-list[];
say $user-list[];
}
第一句检查hash中是否有元素user-list,如果有将元素取出并打印出来
username otheruser
由于是一个数组,可以使用.elems获取数组中元素的个数,使用下标获取单独的一项
然后同样的可以获取元素
if $json{$user-list[]}:exists {
my $info = $json{$user-list[]}; say $info{'ip'};
}
然后元素的存储还是hash,所以接下来就简单了,像取$json的元素一样取$info的元素即可。。这里的例子会打印出username的ip的值
192.168.0.100
那么,JSON::Fast的解析使用就讲到这里了,具体的使用也可以去JSON::Fast的主页看看
https://github.com/timo/json_fast/
最后附上完整代码
#!/usr/bin/perl6 sub MAIN(Str :c(:$config-file), *@file) {
if +@file == {
say "No file argument";
return;
} my $json-path = IO::Path.new($config-file); if (!($json-path.e && $json-path.r)) {
say "Config file not exist path -> $json-path";
exit
}
my $json-slurp = $json-path.slurp(); say "Read config file $config-file";
say $json-slurp; my $json; try {
$json = from-json($json-slurp);
CATCH {
default {
"User config has error".say();
"Stack ----->".say();
...
}
}
}
say $json.WHAT;
say $json; my $user-list; if $json{'user-list'}:exists {
$user-list = $json{'user-list'}; say $user-list.elems;
say $user-list[];
say $user-list[];
} if $json{$user-list[]}:exists {
my $info = $json{$user-list[]}; say $info{'ip'};
}
}
perl6 JSON::Fast模块json解析的使用的更多相关文章
-
day15-Python运维开发基础(json序列化模块、random / time / zipfile / OS模块函数)
1. json序列化模块 # ### json """ 所有编程语言都能够识别的数据格式叫做json,是字符串 json: 将数据类型序列化成字符串 pickle:将数据 ...
-
Python(正则 Time datatime os sys random json pickle模块)
正则表达式: import re #导入模块名 p = re.compile(-]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表 ...
-
Python常用模块--json
官方解释: JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.人类很容易读写.机器很容易解析和生成.它基于 JavaScript编程语言的一部分, 标准ECM ...
-
常用模块(json/pickle/shelve/XML)
一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将 ...
-
python3模块: json &; pickle
概念: 序列化(Serialization): 将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的 ...
-
perl6 HTTP::UserAgent (3) JSON
如果一个 URL 要求POST数据是 JSON格式的, 那我们要怎么发送数据呢? 第一种: HTTP::Request 上一篇说到, 发送 POST 数据, 可以: . $ua.post(url, % ...
-
模块 - json/pickle/shelve/xml/configparser
序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 为什么要序列化: 有种办法可以直接把内存数据(eg:10个列表,3 ...
-
python之os与json&;pickle模块
一.os模块 简单概述一下os模块就是与操作系统交互的一个接口 import os #os.getcwd() print(os.getcwd()) # 获取到当前工作目录 # 运行结果:E:\pyt ...
-
python 模块-json
1.JSON(Javascript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Lan ...
随机推荐
-
EF:根据实体类生成表结构SQL
根据实体类生成表结构SQL: PM> Enable-Migrations -ProjectName Domain -StartUpProjectName Handler -Force PM> ...
-
《Linux及安全》实践2
<Linux及安全>实践2 [edited by 5216lwr] 一.Linux基本内核模块 1.1理解什么是内核模块 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合. ...
-
Java面向对象编程 第二章 第一个Java应用
2.1创建Java源文件 Java应用由一个或多个扩展名为".java"的文件构成,这些文件被称为Java源文件,从编译的角度,则被称为编译单元. 本章包含两个Java源文件:Do ...
-
BZOJ4231 : 回忆树
一个长度为$|S|$的串在树上匹配有两种情况: 1.在LCA处转弯,那么这种情况只有$O(|S|)$次,暴力提取出长度为$2|S|$的链进行KMP即可. 2.不转弯,那么可以拆成两个到根路径的询问. ...
-
Java File类应用:递归遍历文件夹和递归删除文件
要求: 1)采用递归遍历文件夹下的所有文件,包括子文件夹下的文件 2)采用递归删除文件下的所有文件 注意: 以下递归删除文件的方法,只能删除文件,所有的文件夹都还会存在 若要删除正文文件夹,可以在递归 ...
-
Python学习手册 :Python 学习笔记第一天
获取当前目录路径: import os os.getcwd() 在输入python程序时,尽量让不是嵌套结构的语句处于最左侧,要不然系统或许会出现"SyntaxError"错误 获 ...
-
[BZOJ1543] 生成树计数 (Kruskal)
Description 给定一个连通的带边权的图(允许自环和重边),求不同的最小生成树个数.两个生成树不同当它们所用的边的序号不同,换句话说,重边算多次. Input 第一行n,m,表示点数和边数(1 ...
-
【Maven】---坐标与依赖
Maven坐标与依赖 最近想深度学习下maven,找到一本书叫<Maven实战>,这本书讲的确实很好,唯一遗憾的是当时maven教学版本是3.0.0的,而目前已经到了3.5.4了,版本存在 ...
-
Mybatis-Plus 3.0代码生成器
package com.kyplatform.generator; import com.baomidou.mybatisplus.core.exceptions.MybatisPlusExcepti ...
-
剑指Offer 46. 孩子们的游戏(圆圈中最后剩下的数) (其他)
题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...