如何在Perl中修改JSON指定键名并保留对应数据?
解决方案
1. 直接解析整份JSON,无需逐行处理
单行JSON文件完全可以通过Perl的JSON模块一次性解析成结构化数据,效率远高于逐行处理:
use JSON::PP; # 读取整个文件内容 open my $fh, '<', '你的文件.json' or die $!; local $/; my $json_content = <$fh>; close $fh; # 解析为Perl哈希引用 my $data = decode_json($json_content);
2. 准确定位目标哈希结构
即使Project1与ad_campaign之间有多层键值对,直接通过哈希链式访问即可定位目标,不需要遍历所有中间键:
# 替换成你实际的层级路径,比如 $data->{Project1}->{键A}->{键B}->{ad_campaign} my $ad_campaign = $data->{Project1}->{中间键1}->{中间键2}->{ad_campaign};
如果不确定中间键名,可安装Data::Diver模块简化深层访问:
use Data::Diver qw(Dive); # 按层级顺序传入键名即可 my $ad_campaign = Dive($data, 'Project1', '键1', '键2', 'ad_campaign');
3. 解决delete无效问题
若delete语句失效,先确认目标是普通哈希引用,再执行键迁移:
use Scalar::Util qw(reftype); # 验证目标结构是否为哈希 die "目标不是哈希引用" unless reftype($ad_campaign) eq 'HASH'; # 迁移数据并删除旧键 if (exists $ad_campaign->{ad_1}) { # 直接用delete返回值赋值,一步完成迁移+删除 $ad_campaign->{ad_101} = delete $ad_campaign->{ad_1}; } else { warn "Project1的ad_campaign中未找到ad_1键"; }
如果目标是被blessed的对象,先转成普通哈希再操作:
$ad_campaign = { %$ad_campaign };
4. 生成紧凑单行JSON
修改完成后,用encode_json生成无冗余空格的单行JSON:
my $new_json = encode_json($data); # 写入新文件 open my $out_fh, '>', '修改后的文件.json' or die $!; print $out_fh $new_json; close $out_fh;
完整示例代码
use JSON::PP; use Scalar::Util qw(reftype); # 读取解析JSON open my $fh, '<', 'input.json' or die "无法打开文件: $!"; local $/; my $data = decode_json(<$fh>); close $fh; # 定位目标哈希 my $target_campaign = $data->{Project1}->{中间键1}->{中间键2}->{ad_campaign}; # 验证并修改键名 if (reftype($target_campaign) eq 'HASH' && exists $target_campaign->{ad_1}) { $target_campaign->{ad_101} = delete $target_campaign->{ad_1}; } else { die "目标结构错误或ad_1不存在"; } # 写入结果 open my $out_fh, '>', 'output.json' or die "无法写入文件: $!"; print $out_fh encode_json($data); close $out_fh;
内容的提问来源于stack exchange,提问作者Cristofayre
相关产品推荐
相关产品推荐

