Perl解码JSON后提取指定值报错:Not a HASH reference
解决Perl解码JSON时的"Not a HASH reference"错误
核心错误原因
你的JSON字符串外层是数组[],decode_json解析后返回的是数组引用,不是哈希引用。直接用$Json->{front}会尝试把数组引用当作哈希引用访问,触发"Not a HASH reference"错误。需要先取数组中的第一个元素(因为数组里只有一个对象),再访问哈希字段。
其他代码问题修正
除了核心错误,代码还有几处语法问题:
use语句末尾缺失分号,且MIME:Base64应该是MIME::Base64(双冒号)saveFile函数的参数列表缺失逗号:my ($file $image)→my ($file, $image)- 变量
imageFile未声明为私有变量(缺失$符号) - 文件操作推荐使用三参数
open写法,更安全且符合现代Perl规范 - 脚本中不需要
return语句,直接执行逻辑即可
修正后的完整代码
use strict; use warnings; use JSON; use Data::Dumper; use MIME::Base64; my $imageDir = "/usr/documents/images/"; # 示例JSON,实际场景front/back应填充有效的base64字符串 my $testJson = '[{ "front":"", "back":"", "shortID":"", "longID":"" } ]'; my $json_data = decode_json($testJson); # 取数组第一个元素(哈希引用) my $item = $json_data->[0]; # 处理front图片(空串decode_base64返回空,实际需替换为有效base64) my $fImage = decode_base64($item->{front}); my $fImagefile = saveFile('Front.jpg', $fImage); # 处理back图片 my $bImage = decode_base64($item->{back}); my $bImagefile = saveFile('Back.jpg', $bImage); print "图片已保存:$fImagefile, $bImagefile\n"; sub saveFile { my ($file, $image) = @_; my $imageFile = $imageDir . $file; # 三参数open写法,带错误信息 open my $img_fh, '>', $imageFile or die "无法创建文件 $imageFile: $!"; print $img_fh $image; close $img_fh; return $imageFile; }
关键说明
- 当JSON结构是数组时,必须通过数组索引(如
->[0])获取内部的哈希对象 - 确保
front和back字段存储的是有效的Base64编码字符串,否则decode_base64会返回空或错误数据 - 使用
strict和warnings能提前发现大部分语法和变量问题,务必保留
内容的提问来源于stack exchange,提问作者Trey
相关产品推荐
相关产品推荐

