You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:59:15