Perl +将JSON转换为CSV文件

vs91vp4v  于 2023-05-11  发布在  Perl
关注(0)|答案(1)|浏览(138)

下面的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.

请问这里有什么问题吗?

fykwrbwg

fykwrbwg1#

你的错误是:
在./uri.pl第15行,<$input>第1行不是HASH引用。
看起来它抱怨的台词是这样的:

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

在这一行中,假设$json_data是一个哈希的引用,然后尝试用%{$json_data}解除它的引用。但似乎$json_data不包含对散列的引用。Perl讨厌你把不是哈希引用的东西当作哈希引用来处理,所以它会抛出你看到的错误并杀死程序。
因此,如果$json_data不是哈希引用,则需要知道它是什么。有几种方法可以做到这一点。
1.您可以查看players.json文件的内容。如果该文件中的JSON数据是一个散列,它将以{字符开始。
1.您可以使用类似Data::Dumper的东西在程序中打印$json_data的转储。同样,作为哈希引用的数据结构将以{开始。
1.您可以使用ref()打印$json_data是对-print ref $json_data的引用。
根据我的经验,JSON数据要么存储在哈希中,要么存储在数组中。我想你会发现两件事中有一件是真的。

  1. players.json不包含有效的JSON,因此对decode_json()的调用失败,并且$json_data未定义。
  2. players.json包含一个数组,而不是一个散列。

相关问题