使用Perl解析JSON
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Perl解析JSON相关的知识,希望对你有一定的参考价值。
我编写了一个测试脚本来执行某些功能。脚本按预期工作。目前,运行脚本所需的参数是使用Getopt::Long
从命令行传递的。我想将命令行参数移动到json文件。端点ip仍将作为命令行arg传递。我希望端点ip充当密钥。例如,如果端点是1.1.1.1,我想获得下面提到的json配置文件中端点id 1.1.1.1下列出的client_ip,client_interface_ip,originip,....端口。我怎么做 ?
当前版本的脚本:
use Getopt::Long;
my ($self) = @_;
GetOptions (
"endpoint|e=s" => $self->{'endpoint'},
"aggregator|a=s" => $self->{'aggregator'},
"port|pt=s" => $self->{'port'},
"client|c=s" => $self->{'client'},
"client_interface|ci=s" => $self->{'client_interface'},
"origin|o=s" => $self->{'origin'},
"origin_interface|oi=s" => $self->{'origin_interface'},
"interfacename|ot=s" => $self->{'i1'},
"interfacename2|it=s" => $self->{'i2'},
) || $self->abort( "Invalid command line options.
Valid options are endpoint,aggregator,port,client,client_interface,
origin,origin_interface,outertunnel,innertunnel,");
#Terminate the script execution if the reqd args are not passed
my @required_args = qw(endpoint aggregator port client client_interface origin origin_interface
);
for my $command_line_arguments (@required_args) {
unless ($self->{$command_line_arguments}) {
$self->abort('missing required argument ' . $command_line_arguments);
}
}
$self->{'tObj'} = QA::crypto::tunnels->new
('host'=> $self->{'endpoint'})
or $self->abort('[Could not create a QA::Crypto::tunnels object.]');
参数的json文件:
{
"Endpoints": [{
"endpoint": "1.1.1.1",
"client_ip": "3.4.5.6",
"client_interface_ip": "10.11.12.14",
"origin": "a.a.a.a",
"origin_interface": "15.16.17.18",
"interfacename": "name",
"interfacename2": "name1",
"sl": 19,
"port": 362
}, {
"endpoint": "2.2.2.2",
"client_ip": "19.20.21.22",
"client_interface_ip": "23.24.25.26",
"origin": "1.2.3.4",
"origin_interface": "5.6.7.8",
"interfacename": "interface name",
"interfacename2": "interfacename_2",
"sl": 19,
"port": 366
}]
}
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
my $json;
{
open my $fh, "<", "cfg.txt"
or die("Can't open file "cfg.json": $!
");
local $/;
$json = <$fh>;
}
my $data = decode_json($json);
$json = JSON->new->utf8->pretty->encode($data);
第一个问题是关于JSON文件的合适设计。哈希可以在这里很好地服务,而似乎根本不需要arrayref。端点值可以是键,其值是具有密钥相关信息的hashref。如果您愿意,也可以将端点值保留在其hashref中。
你的JSON中的关键"Endpoints"
似乎没有做多少。但是如果你确实需要它,也许因为会有其他类型的键,那么你可以为它的值另一个hashref,它将包含带有端点值作为键的hashref。
例如
{ "Endpoints": { "1.1.1.1": { "client_ip": "3.4.5.6", ... }, "2.2.2.2": { "client_ip": "19.20.21.22", ... }, ... }, "OtherKeys": { ... }, ... }
最后的值不应以逗号结尾。见JSON format。
当你把它带入Perl时,你会有嵌套的hashrefs,比如
$data = {
Endpoints => {
1.1.1.1 => { client_ip => '3.4.5.6', ... },
2.2.2.2 => { client_ip => '19.20.21.22', ... },
},
OtherKeys => { ... },
};
然后简单地检索值
my $client_ip = $data->{Endpoints}{'1.1.1.1'}{client_ip};
例如,检索所有端点并为它们列出qazxsw poi
client_ip
请参阅my @endpoints = keys %{$data->{Endpoints}};
foreach my $ip (@endpoints) {
say $data->{Endpoints}{$ip}{client_ip};
}
,Using References in perlref完全是关于它的。另见this post和perlreftut。
我们可以用perldsc检查(参见)整个数据结构
Data::Dumper
还有许多其他包用于处理嵌套数据结构。
请注意,use Data::Dumper;
my $data = decode_json($json);
print Dumper($data);
包附带了JSON和相关方法,因此您可以以编程方式创建该文件。这可能有助于确保其格式正确并在将来进行维护。
以上是关于使用Perl解析JSON的主要内容,如果未能解决你的问题,请参考以下文章
使用 json rereiver php mysql 在片段中填充列表视图
解析:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项
ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项