2015-10-15 30 views
0

JSON響應創建哈希我有一個JSON響應,如如何從Perl中

{ 
    "extId" : "abc:3", 
    "intId" : "val:0500019141EBE54B", 
    "type" : "Map" 
}{ 
    "extId" : "abc:4", 
    "intId" : "val:0500012BEA8FEC15", 
    "type" : "Map" 
}{ 
    "extId" : "abc:3", 
    "intId" : "val:0500019141EBE54B", 
    "type" : "Map" 
} 

我想創建一個哈希如$hash{abc:3} = val:0500019141EBE54B,使我可以確認正在創建的同一intId對於相同的extId。感謝幫助。

+0

['JSON'](https://metacpan.org/pod/JSON)也許? – TLP

+0

更具體地說,[from_json](https://metacpan.org/pod/JSON#from_json)可以滿足您的需求。 – bytepusher

+5

這不是JSON。在整個過程中,'} {'和缺少'[]'之間缺少逗號。 – choroba

回答

0
use Data::Dumper; 

my @data = <DATA>; 

s/[\r\n\s{}",]//g, s/(ext|int)Id:|type:Map// for @data; 

my %hash = grep length, @data; 

print Dumper \%hash; 

__DATA__ 

{ 
    "extId" : "abc:3", 
    "intId" : "val:0500019141EBE54B", 
    "type" : "Map" 
}{ 
    "extId" : "abc:4", 
    "intId" : "val:0500012BEA8FEC15", 
    "type" : "Map" 
}{ 
    "extId" : "abc:3", 
    "intId" : "val:0500019141EBE54B", 
    "type" : "Map" 
} 

請注意,字段(extId,intId)是強制性的。

0

你沒有發佈的內容不是JSON。鑑於你說這是來自JSON響應,我會猜測這是一個轉置錯誤。如果這是而不是的情況下,這將不起作用 - 但你應該捅人給你的JSON,並告訴他們他們做錯了。

你也應該注意 - 你要求的散列 - 你有intId中的重複鍵。如果你把它轉換成散列,你將會丟失其中的一個。

然而上述假設:

#!/usr/bin/env perl 
use strict; 
use warnings; 

use JSON; 
use Data::Dumper; 

my $JSON_text = '[ 
    { 
     "extId" : "abc:3", 
     "type" : "Map", 
     "intId" : "val:0500019141EBE54B" 
    }, 
    { 
     "intId" : "val:0500012BEA8FEC15", 
     "type" : "Map", 
     "extId" : "abc:4" 
    }, 
    { 
     "intId" : "val:0500019141EBE54B", 
     "type" : "Map", 
     "extId" : "abc:3" 
    } 
]'; 

#turn JSON into a perl data structure. 
#In this case, an array of anon hashes. 
my $json_obj = decode_json ($JSON_text); 
print Dumper \$json_obj; 

#process that perl data structure, and extract the keys 
# use the fact that a list of paired values can be 
#assigned to a hash as if they were key-value pairs: 
my %int_ext = map { $_ -> {extId}, 
        $_ -> {intId} } 
          @{$json_obj}; 
print Dumper \%int_ext; 

這使我們%int_ext哈希:

$VAR1 = { 
      'abc:3' => 'val:0500019141EBE54B', 
      'abc:4' => 'val:0500012BEA8FEC15' 
     }; 

注 - 因爲你有兩個abc:3鍵,就 「失去」 他們中的一個。 (第一個被覆蓋,在這種情況下不重要)。