如何在perl中从json响应创建哈希

时间:2015-10-15 22:34:18

标签: perl

我有一个json响应,例如

{  
  "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。感谢帮助。

2 个答案:

答案 0 :(得分: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)是强制性的。

答案 1 :(得分: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键,因此您“丢失”了其中一个键。 (第一个被覆盖,在这种情况下并不重要)。