2017-08-15 11 views
-5

変換する必要があり、以下のperlスクリプトは、JSONperlは

#!/usr/bin/perl 

use strict; 
use warnings; 
use JSON; 

my $file = 'players.json'; 

open(my $input, "<", $file) or die $!; 

my $json_data = decode_json(
    do { local $/; <$input> } 
); 
foreach my $player_id (keys %{$json_data}) { 
foreach my $fixture (
     @{ $json_data->{$player_id}->{fixture_history}->{all} }) 
    { 
     print join(",", 
      $player_id, $json_data->{$player_id}->{web_name}, 
      @{$fixture}, "\n",); 
    } 

    } 

JSONファイルは、/ tmpフォルダの下にあるCSVするCSVファイルにJSONに変換します+/tmpに私が取得:

./jsonTOcsv.pl 

Not a HASH reference at ./uri.pl line 15, <$input> line 1. 

は、ここでは何が間違っているアドバイスをしてください?

+0

基本的には、ハッシュ構造の配列のハッシュを期待していますが、そうではないようです。 – Ouki

+0

ここで問題は何ですか? –

+3

'Use Data :: Dumper; print Dumper($ json_data); ' – toolic

答えて

2

あなたのエラーはこれです:./uri.plライン15で

ないHASHの参照、ライン1

が、それは文句を言っている行のように見えることはこれです:

foreach my $player_id (keys %{$json_data}) { 

この行では、$json_dataはハッシュへの参照であり、%{$json_data}で逆参照しようとしています。しかし、$json_dataにはハッシュへの参照が含まれていないようです。ハッシュリファレンスではないものをハッシュリファレンスとして処理しようとすると、Perlはそれを嫌うので、あなたが見ているエラーを投げ、プログラムを殺します。

したがって、ハッシュリファレンスでない場合、何が$json_dataにあるのかを知る必要があります。それを行うにはいくつかの方法があります。

  1. players.jsonファイルの内容を見ることができます。そのファイル内のJSONデータがハッシュの場合は、{文字で始まります。
  2. Data::Dumperのようなものを使用して、プログラム内に$json_dataというダンプを印刷することができます。もう一度、ハッシュリファレンスであるデータ構造は{で始まります。
  3. ref()を使用して、$json_dataが-への参照となるものを印刷することができます。

私の経験では、JSONデータはハッシュまたは配列のいずれかに格納されています。私はあなたが2つの事のうちの1つが真であることを見つけるだろうと思う。

  1. players.json

    はそうdecode_json()への通話が失敗して、有効なJSOMが含まれていないと$json_dataは未定義です。
  2. players.jsonには、ハッシュではなく配列が含まれています。