下面是必须解析的json字符串
[{"mnemonic":"SIG1039.CA.01","ID":"203024","portList":null},{"mnemonic":"SIG0315.OR.01","ID":"035066","portList":03}
以上json格式 如果portlist为空,那么
通过附加03和04创建2个值,并将7802添加到ID。
,即780220302403,780220302404
如果portlist有一个条目,只需附加它并将7802添加到ID
即780203506603
下面的代码是否正确,我使用map来实现它,但不正确 什么是正确的方法。
use lib '.';
use JSON::PP qw(decode_json);
use File::Find;
use Switch;
use Data::Dumper;
use strict;
open my $my_fh, '<', 'Data.txt' or die $!;
my $data = <$fh_ptoto_wiu>;
my $decoded_data = decode_json $data;
for (@$decoded_data ){
my ($value) = map { $_ eq null ? [7802.$_->{ID}.03,7802.$_->{ID}.04] : 7802.$_->{ID}.$_->{portList} } $_->{portList};
push @myarray,$value;
}
答案 0 :(得分:1)
为了使这项工作,我需要修复JSON。由于前导零而需要引用第二个03
中的portList
,并且缺少数组的结束]
。
以下程序演示了如何解决您的问题。
use strict;
use warnings;
use JSON 'decode_json';
use Data::Printer;
my $data = <DATA>;
my $decoded_data = decode_json $data;
my @myarray;
foreach my $obj (@$decoded_data) {
my $value;
if ( $obj->{portList} ) {
# if the portlist has an entry just append it and prepend 7802 to ID
$value = [ '7802' . $obj->{ID} . $obj->{portList} ];
} else {
# Create 2 values by appending 03 and 04 and prepend 7802 to ID
$value = [
'7802' . $obj->{ID} . '03',
'7802' . $obj->{ID} . '04',
];
}
push @myarray, $value;
}
p @myarray;
__DATA__
[{"mnemonic":"SIG1039.CA.01","ID":"203024","portList":null},{"mnemonic":"SIG0315.OR.01","ID":"035066","portList":"03"}]
输出看起来非常像你的例子。
[
[0] [
[0] 780220302403,
[1] 780220302404
],
[1] [
[0] 780203506603
]
]
在Perl中使用JSON模块时,您需要知道null
值将转换为undef
。您正在使用文字eq
执行与null
相等的字符串,这在您的程序中不存在。只使用null
会使Perl认为它是一个不带引号的字符串,因为没有该名称的功能,这是不允许的(因为strict
)。如果你引用它,它仍然没有意义。它将提供&#34;使用未初始化的价值&#34;警告。
除此之外,如果你可以做一个循环来让事情变得更清楚,那就不要map
。