如何在perl中删除JSON对象
我正在处理一个JSON配置文件(logstash转发器),在该文件中,我希望使用perl脚本添加或删除数据(该脚本用于部署或取消部署jboss webapps,然后可以用于更新logstash转发器配置) 我在添加和修改配置文件方面没有问题,但我找不到删除对象的正确方法 下面是config.json文件的一个示例:如何在perl中删除JSON对象,json,perl,Json,Perl,我正在处理一个JSON配置文件(logstash转发器),在该文件中,我希望使用perl脚本添加或删除数据(该脚本用于部署或取消部署jboss webapps,然后可以用于更新logstash转发器配置) 我在添加和修改配置文件方面没有问题,但我找不到删除对象的正确方法 下面是config.json文件的一个示例: { "network" : { "timeout" : 15, "ssl ca" : "/etc/logstash-forwa
{
"network" : {
"timeout" : 15,
"ssl ca" : "/etc/logstash-forwarder/cert/logstash-forwarder.crt",
"servers" : [
"server1@domain:5043",
"server2@domain:5043"
] },
"files" : [
{
"fields" : {
"environment" : "TEST1,TEST23",
"application" : "application1",
"type" : "jboss"
},
"paths" : [
"/path/to/application1/logs/*.log"
]
},
{
"fields" : {
"environment" : "TEST2",
"application" : "application2",
"type" : "jboss"
},
"paths" : [
"/path/to/application2/logs/*.log"
]
}
]
}
以及我用来删除对象的代码部分(当webapp取消部署时):
如何摆脱剩余的empy花括号(“{}”或“{},”,如果我删除的应用程序不是数组的最后一个),它们阻止我进行进一步的解析,并让我使用不整洁的config.json文件
我当然可以找到一个sed解决方案,但有更干净的吗
提前感谢您的帮助。清空哈希值不足以将其从数组中删除
您可以使用
splice
或将所有需要的记录复制到新阵列:
my $data = JSON::decode_json($json);
my @files = @{ $data->{'files'} };
my @new_files;
foreach my $f (@files) {
my @paths = @{ $f->{paths} };
foreach my $path (@paths) {
unless ( $path eq $app_path ) {
push @new_files, $f;
}
}
}
$data->{files} = \@new_files;
您可以使用
splice
删除由其索引定义的数组成员(从“文件”:[
)。
{
"network" : {
"timeout" : 15,
"ssl ca" : "/etc/logstash-forwarder/cert/logstash-forwarder.crt",
"servers" : [
"server1@domain:5043",
"server2@domain:5043"
] },
"files" : [
{
"fields" : {
"environment" : "TEST1,TEST23",
"application" : "application1",
"type" : "jboss"
},
"paths" : [
"/path/to/application1/logs/*.log"
]
},
{}
]
}
my $data = JSON::decode_json($json);
my @files = @{ $data->{'files'} };
my @new_files;
foreach my $f (@files) {
my @paths = @{ $f->{paths} };
foreach my $path (@paths) {
unless ( $path eq $app_path ) {
push @new_files, $f;
}
}
}
$data->{files} = \@new_files;