以下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.
请告知这里有什么问题?
答案 0 :(得分:2)
您的错误是:
不是./uri.pl第15行第1行的HASH参考。
看起来它抱怨的是:
foreach my $player_id ( keys %{$json_data} ) {
在这一行中,您假设$json_data
是对哈希的引用,并尝试使用%{$json_data}
取消引用它。但似乎$json_data
不包含对哈希的引用。 Perl讨厌它,如果你试图处理一个不是哈希引用的东西,好像它是一个哈希引用,所以它会抛出你看到的错误并杀死程序。
因此,如果它不是哈希引用,您需要知道$json_data
中的内容。有几种方法可以做到这一点。
players.json
文件的内容。如果该文件中的JSON数据是哈希值,则它将以{
字符开头。$json_data
转储。同样,作为哈希引用的数据结构将以{
开始。ref()
打印$json_data
引用的内容 - print ref $json_data
。根据我的经验,JSON数据存储在散列或数组中。我怀疑你会发现两件事之一是真的。
players.json
不包含有效的JSOM,因此您对decode_json()
的调用失败,$json_data
未定义。players.json
包含一个数组,而不是哈希值。