2016-09-16 19 views
1

データベースに格納されているJSON文字列を解析しています。Perl、JSONの値の解析が正しくありません

{"name":"simon", "age":"23", "height":"tall"}

私はデコードし、その後、データを引っ張っています。以下のコードを実行すると、私は奇妙な 'HASH'値を返しています。

use JSON; 

$data = decode_json($row->{'address'}); 
for my $key (keys %$data){ 
     if($data->{$key} ne ''){ 
       $XML .= "  <$key>$data->{$key}</$key>"; 
     } 
} 

// Returns data like so 

<company_type>HASH(0x27dbac0)</company_type> 
<county>HASH(0x27db7c0)</county> 
<address1>HASH(0x27dba90)</address1> 
<company_name>HASH(0x27db808)</company_name> 

私はそうのようなデータセットを持っているときにエラーが起こる:

{"name":"", "age":{}, "height":{}}

JSON /配列/ハッシュはPerlでと協力するのは困難であることを持っている理由私は理解していません。何が欠けているのですか?

+0

JSONにはどのperlモジュールを使用しますか? – redneb

+0

JSONモジュール! 'JSONを使う '。そのDebianサーバ –

+0

'' Dumper($ data) 'を(' use Data :: Dumper'で)印刷しようとしましたか?それは私のためにうまく動作します。 – zdim

答えて

5

フラットハッシュを処理していますが、実際にはデータに別のネストされたハッシュリファレンスがあります。ライン

{ "name":"", "age":{}, "height":{} } 

{}は、「何を」を意味しないことを意図してもよいが、実際JSON "object"、(実際に空である)ネストされたデータの次のレベルにあります。 Perlでは、ハッシュリファレンスを取得しています。これがコードの出力です。

JSONの他の柱は「配列」であり、Perlでは配列参照があります。つまり、decode_jsonは最上位レベルのhashrefを返します。これは、逆参照されるとハッシュまたは配列の参照が値として含まれる可能性があります。 Data::Dumperで構造全体を印刷すると、それが表示されます。

これをネゴシエートするために、毎回参照をテストする必要があります。逆参照されたハッシュや配列にはさらにレベル(より多くの参照)が含まれている可能性があるため、再帰ルーチン(例としてthis postを参照)または複雑なデータ構造のモジュールを使用する必要があります。しかし、最初のレベル

for my $key (keys %$data) 
{ 
    next if $data->{$key} eq ''; 

    my $ref_type = ref $data->{$key}; 

    # if $data->{key} is not a reference ref() returns an empty string (false) 
    if (not $ref_type) { 
     $XML .= "  <$key>$data->{$key}</$key>"; 
    } 
    elsif ($ref_type eq 'HASH') { 
     # hashref, unpack and parse. it may contain references 
     say "$_ => $data->{$key}{$_}" for keys %{ $data->{$key} }; 
    } 
    elsif ($ref_type eq 'ARRAY') { 
     # arrayref, unpack and parse. it may contain references 
     say "@{$data->{$key}}"; 
    } 
    else { say "Reference is to type: $ref_type" } 
} 

ためrefの引数は、参照(ただし、文字列または数値)でない場合にはfalseと評価空の文字列を返す、とあなたはプレーンなデータを持っている場合、これはあります。それ以外の場合は、参照先の型を返します。 JSONからは、HASHまたはARRAYのいずれかになります。これは入れ子の仕方です。

ここに示した例では、hashrefを実行しています。表示されているものは空ですので、破棄することができます。特定の例ののコードは、1つのステートメントに大きく削減できます。しかし、他のテストはそのままにしておきます。これは、ポストされた例と同様に機能するはずです。

+0

誰かがダウンボートについて説明したり、推測したりしますか? – zdim

関連する問題