2016-09-20 51 views
-1

下面检查字段是具有JSON字符串进行解析追加和预先计算的值由在JSON字符串

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

在上述JSON格式 如果portlist为空,则

  1. 通过追加03和04并将7802加入ID来创建2个值。

    即780220302403,780220302404

  2. ,或者如果portlist有一个条目只是把它和前面加上7802追加到ID

    即780203506603

是下面的代码正确,我用地图来实现它,但是不正确 什么是正确的方法。

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

你想让我们告诉你什么?你已经说过它是适当的。那是什么意思? – simbabque

+1

你的代码不会编译。 Perl中没有'null'(除非你定义了一个名为'null'的函数,并没有向我们展示它)。 – simbabque

+0

@simbabque什么是正确的方法,哪里出错了,有什么建议? – LearningCpp

回答

1

为了使这项工作,我需要修复JSON。需要引用第二个portList中的03,因为前导零,并且数组的结尾]丢失。

以下程序演示如何解决您的问题。

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 
    ] 
] 

你需要知道,null值将转换为undef当您使用Perl中JSON模块。你正在做的字符串等于eq与文字null,它只是不存在于你的程序。使用null将使Perl认为它是一个不带引号的字符串,因为没有该名称的功能,这是不允许的(因为strict)。如果你引用它,它仍然没有意义。它会给出“使用未初始化值”警告。

除此之外,如果你可以做一个循环,使东西更清晰,不要做map

+0

if($ _-> {portList} eq“”)条件正在使用null值如果( – LearningCpp

+1

)JSON中的“null”在Perl数据结构中被转换为“undef”。所以我认为'if(定义$ _-> {portList})'是最好的检查。与空字符串比较可能会起作用 - 但是您会在'use warnings'下面发出警告。 –

+0

我们可以将json数据作为参数发送给函数。像 my $ json_data = decode_json $ my_file_data; fetch_json_data($ json_data); sub fetch_json_data {my $ data = @_; }不起作用,我们是否需要使用特定的json函数来实现这个 – LearningCpp