perl +将json转换为csv文件

时间:2017-08-15 15:49:47

标签: linux perl csv json

以下perl脚本应将json转换为csv

#!/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文件夹下 - players.json

ls /tmp | grep  players.json
players.json

当我在/ tmp下运行脚本时,我得到:

./jsonTOcsv.pl

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

请告知这里有什么问题?

1 个答案:

答案 0 :(得分:2)

您的错误是:

  

不是./uri.pl第15行第1行的HASH参考。

看起来它抱怨的是:

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引用的内容 - print ref $json_data
  4. 根据我的经验,JSON数据存储在散列或数组中。我怀疑你会发现两件事之一是真的。

    1. players.json不包含有效的JSOM,因此您对decode_json()的调用失败,$json_data未定义。
    2. players.json包含一个数组,而不是哈希值。