5

perlでjsonファイルを解析しようとしています。キー「名前」とそれに対応する値を抽出したい。私のファイルは次のようになります

{
 "data":[
    {
        "name":"ABC",
        "id":"123",
    },
    {
        "name":"PQR",
        "id":"456",
    },
    {
        "name":"XYZ",
        "id":"789",
    }
]
}

私は以下のコードで試しています:

#/usr/lib/perl
use lib qw( ..);
use LWP::Simple;
use JSON;
my $filename = '/file.txt';
my $data;
if (open (my $json_str, $filename))
{
  local $/ = undef;
  my $json = JSON->new;
  $data = $json->decode(<$json_str>);
  close($json_stream);
}
print $data->{name};

しかし、出力が得られません。

誰が何が悪いのか教えてもらえますか?

4

2 に答える 2

24

json ファイルが無効です。

行 5、10、15 は、これらのハッシュの最後のキーと値のペアであるため、コンマで終了しないでください。

それを修正した後、期待される結果が得られるコードのバージョンは次のとおりです。

#/usr/lib/perl
use strict;
use warnings;

use lib qw(..);

use JSON qw( );

my $filename = 'file.txt';

my $json_text = do {
   open(my $json_fh, "<:encoding(UTF-8)", $filename)
      or die("Can't open \"$filename\": $!\n");
   local $/;
   <$json_fh>
};

my $json = JSON->new;
my $data = $json->decode($json_text);

for ( @{$data->{data}} ) {
   print $_->{name}."\n";
}

問題のいくつか:

  • と を使用$json_streamして$json_strいました。$json_streamファイルハンドルを示すためにすべての場所で使用するつもりでした
  • これ$data->{name}は、json 自体ではなく、.json ファイル内の配列のすべてのメンバーに適用する必要があります。したがって、最初にそれらを反復処理する必要があります

これをデバッグするときは、json が有効であることを確認してください。jsonlint.comまたはcpan のJSON::XSに付属するjson_xsユーティリティを使用します

JSON は複雑なデータ構造を記述できるため、それを Perl に解析すると、複雑なデータ構造も得られます。まず、Data:: DumperまたはData::PrinterまたはData::TreeDumperを使用してデータ構造を調べてみてください。

于 2013-03-27T07:09:55.013 に答える
5

JSON 文字列に余分なカンマがあるだけでなく、正しい値を参照していません。常に使用

use strict; 
use warnings;

-- 彼らは何が悪いのかを教えてくれます。$data->{name}この場合、値が割り当てられていない変数である undefined valueを出力しています。デコードされた構造を印刷するData::Dumperと、次のようになります。

$VAR1 = {
          'data' => [
                      {
                        'name' => 'ABC',
                        'id' => '123'
                      },
                      {
                        'name' => 'PQR',
                        'id' => '456'
                      },
                      {
                        'name' => 'XYZ',
                        'id' => '789'
                      }
                    ]
        };

ご覧のとおり、$dataは実際にはハッシュ参照であり、最初で唯一のキーは と呼ばれ'data'、その値は 3 つの要素を持つ配列であり、それぞれにハッシュ参照が含まれています。したがって、これらの要素を印刷するには、次のようにします。

print $data->{data}[0]{name};   # prints ABC

my $aref = $data->{data};
for my $element (@$aref) {
    print $element->{name};     # prints ABC, PQR, XYZ
}
于 2013-03-27T07:23:07.797 に答える