通过检查JSON字符串

时间:2016-09-20 15:20:52

标签: perl

下面是必须解析的json字符串

 [{"mnemonic":"SIG1039.CA.01","ID":"203024","portList":null},{"mnemonic":"SIG0315.OR.01","ID":"035066","portList":03} 

以上json格式 如果portlist为空,那么

  1. 通过附加03和04创建2个值,并将7802添加到ID。

      

    ,即780220302403,780220302404

  2. 如果portlist有一个条目,只需附加它并将7802添加到ID

      

    即780203506603

  3. 下面的代码是否正确,我使用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;
     }
    

1 个答案:

答案 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