2016-09-20 44 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