问题描述
Newbuy的问题。
{
"Controllers":[
{
"Command Status" : {
"Controller" : 0,"Status" : "Success","Description" : "None"
},"Response Data" : {
"Product Name" : "LSI MegaraID SAS 9260-8i","Serial Number" : "SV30408696","SAS Address" : " 500605b005c557f0","PCI Address" : "00:01:00:00","System Time" : "11/02/2020 01:15:01","Mfg. Date" : "01/23/13","Controller Time" : "11/02/2020 08:03:07","FW Package Build" : "12.15.0-0239","FW Version" : "2.130.403-4660","BIOS Version" : "3.30.02.2_4.16.08.00_0x06060A05","Driver Name" : "megaraid_sas","Driver Version" : "07.703.05.00-rc1","vendor Id" : 4096,"Device Id" : 121,"Subvendor Id" : 4096,"SubDevice Id" : 37473,"Host Interface" : "PCI-E","Device Interface" : "SAS-6G","Bus Number" : 1,"Device Number" : 0,"Function Number" : 0,"Drive Groups" : 6,"TOPOLOGY" : [
{
"DG" : 0,"Arr" : "-","Row" : "-","EID:Slot" : "-","DID" : "-","Type" : "RAID1","State" : "Optl","BT" : "N","Size" : "465.25 GB","PDC" : "dflt","PI" : "N","SED" : "N","DS3" : "none","FSpace" : "N","TR" : "N"
},{
"DG" : 0,"Arr" : 0,"Row" : 0,"EID:Slot" : "252:1","DID" : 8,"Type" : "DRIVE","State" : "Onln","FSpace" : "-","Row" : 1,"EID:Slot" : "252:0","DID" : 9,{
"DG" : 1,"Type" : "RAID0","Size" : "3.637 TB","EID:Slot" : "252:2","DID" : 10,{
"DG" : 2,"EID:Slot" : "252:3","DID" : 11,{
"DG" : 3,"EID:Slot" : "252:4","DID" : 13,{
"DG" : 4,"EID:Slot" : "252:5","DID" : 14,{
"DG" : 5,"EID:Slot" : "252:6","DID" : 15,"TR" : "N"
}
],"Virtual Drives" : 6,"VD LIST" : [
{
"DG/VD" : "0/0","TYPE" : "RAID1","Access" : "RW","Consist" : "Yes","Cache" : "RWTD","Cac" : "-","sCC" : "ON","Name" : ""
},{
"DG/VD" : "1/1","TYPE" : "RAID0",{
"DG/VD" : "2/2",{
"DG/VD" : "3/3",{
"DG/VD" : "4/4",{
"DG/VD" : "5/5","Name" : ""
}
],"Physical Drives" : 7,"PD LIST" : [
{
"EID:Slt" : "252:0","DG" : 0,"Intf" : "SATA","Med" : "HDD","SeSz" : "512B","Model" : "ST500DM002-1BD142","Sp" : "U","Type" : "-"
},{
"EID:Slt" : "252:1",{
"EID:Slt" : "252:2","DG" : 1,"Model" : "ST4000NM0033-9ZM170",{
"EID:Slt" : "252:3","DG" : 2,{
"EID:Slt" : "252:4","DG" : 3,{
"EID:Slt" : "252:5","DG" : 4,{
"EID:Slt" : "252:6","DG" : 5,"Type" : "-"
}
]
}
}
]
}
这是RAID控制器测试的日志。任务听起来像是:检查所有虚拟驱动器(其状态)以及每个虚拟驱动器中的每个磁盘以及磁盘的状态。
现在,我什至不了解如何访问顶级项目。尝试了很多选择,但完全不了解。 代码示例之一:
#!/usr/bin/perl
use strict;
use warnings;
use JSON::XS;
use File::Slurp;
use Data::Dumper;
my $json_source = "state.json";
my $json = read_file( $json_source ) or die "Couldn't read the file";
my $json_array = decode_json $json or die "Couldn't recognize JSON";
foreach my $item( %$json_array{Controllers} ) {
print Dumper($item->{'Command status'});
}
对于理解或代码示例方面的帮助将非常感谢。如我所见,json的第二级键名中的空格可能是一个问题。此外,decode_json()完全返回什么-链接到什么?要哈希,要数组,要哈希数组?不可能这么复杂-我看到了使用相同json的python示例-它看起来非常简单(确实如此)。请帮助。
解决方法
输入数据表示复杂的结构。我们只需要提取感兴趣的信息。
这可以通过利用具有感兴趣字段的数组来实现。将数据放入数组后,我们必须遍历数组。
请调查以下符合您任务要求的代码。
track.setAttribute('default','');
输出
use strict;
use warnings;
use feature 'say';
use JSON;
my $data = do { local $/; <DATA> };
my $struct = from_json($data);
my @product = ('Product Name','Serial Number','System Time','Controller Time','Mfg. Date','FW Package Build','FW Version','BIOS Version','Driver Name','Driver Version','Host Interface','Device Interface'
);
my @status = qw/Controller Status Description/;
my @v_fields = ('DG/VD','TYPE','State','Access','Size','Name');
my @p_fields = ('DG','DID','Med','Intf','Model');
for my $c ( @{ $struct->{Controllers} } ) {
say '--- Status ' . '-' x 45;
printf "%-12s %s\n",$_,$c->{'Command Status'}{$_} for @status;
say '--- Product ' . '-' x 44;
printf "%-18s %s\n",$c->{'Response Data'}{$_} for @product;
say '--- Virtual ' . '-' x 60;
say join "\t",@v_fields;
for my $vd ( @{ $c->{'Response Data'}{'VD LIST'} } ) {
say join "\t",$vd->@{@v_fields};
}
say '--- Physical ' . '-' x 60;
say join "\t",@p_fields;
for my $pd ( @{ $c->{'Response Data'}{'PD LIST'} } ) {
say join "\t",$pd->@{@p_fields};
}
}
__DATA__
{
"Controllers":[
{
"Command Status" : {
"Controller" : 0,"Status" : "Success","Description" : "None"
},"Response Data" : {
"Product Name" : "LSI MegaRAID SAS 9260-8i","Serial Number" : "SV30408696","SAS Address" : " 500605b005c557f0","PCI Address" : "00:01:00:00","System Time" : "11/02/2020 01:15:01","Mfg. Date" : "01/23/13","Controller Time" : "11/02/2020 08:03:07","FW Package Build" : "12.15.0-0239","FW Version" : "2.130.403-4660","BIOS Version" : "3.30.02.2_4.16.08.00_0x06060A05","Driver Name" : "megaraid_sas","Driver Version" : "07.703.05.00-rc1","Vendor Id" : 4096,"Device Id" : 121,"SubVendor Id" : 4096,"SubDevice Id" : 37473,"Host Interface" : "PCI-E","Device Interface" : "SAS-6G","Bus Number" : 1,"Device Number" : 0,"Function Number" : 0,"Drive Groups" : 6,"TOPOLOGY" : [
{
"DG" : 0,"Arr" : "-","Row" : "-","EID:Slot" : "-","DID" : "-","Type" : "RAID1","State" : "Optl","BT" : "N","Size" : "465.25 GB","PDC" : "dflt","PI" : "N","SED" : "N","DS3" : "none","FSpace" : "N","TR" : "N"
},{
"DG" : 0,"Arr" : 0,"Row" : 0,"EID:Slot" : "252:1","DID" : 8,"Type" : "DRIVE","State" : "Onln","FSpace" : "-","Row" : 1,"EID:Slot" : "252:0","DID" : 9,{
"DG" : 1,"Type" : "RAID0","Size" : "3.637 TB","EID:Slot" : "252:2","DID" : 10,{
"DG" : 2,"EID:Slot" : "252:3","DID" : 11,{
"DG" : 3,"EID:Slot" : "252:4","DID" : 13,{
"DG" : 4,"EID:Slot" : "252:5","DID" : 14,{
"DG" : 5,"EID:Slot" : "252:6","DID" : 15,"TR" : "N"
}
],"Virtual Drives" : 6,"VD LIST" : [
{
"DG/VD" : "0/0","TYPE" : "RAID1","Access" : "RW","Consist" : "Yes","Cache" : "RWTD","Cac" : "-","sCC" : "ON","Name" : ""
},{
"DG/VD" : "1/1","TYPE" : "RAID0",{
"DG/VD" : "2/2",{
"DG/VD" : "3/3",{
"DG/VD" : "4/4",{
"DG/VD" : "5/5","Name" : ""
}
],"Physical Drives" : 7,"PD LIST" : [
{
"EID:Slt" : "252:0","DG" : 0,"Intf" : "SATA","Med" : "HDD","SeSz" : "512B","Model" : "ST500DM002-1BD142","Sp" : "U","Type" : "-"
},{
"EID:Slt" : "252:1",{
"EID:Slt" : "252:2","DG" : 1,"Model" : "ST4000NM0033-9ZM170",{
"EID:Slt" : "252:3","DG" : 2,{
"EID:Slt" : "252:4","DG" : 3,{
"EID:Slt" : "252:5","DG" : 4,{
"EID:Slt" : "252:6","DG" : 5,"Type" : "-"
}
]
}
}
]
}