Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl中删除JSON对象_Json_Perl - Fatal编程技术网

如何在perl中删除JSON对象

如何在perl中删除JSON对象,json,perl,Json,Perl,我正在处理一个JSON配置文件(logstash转发器),在该文件中,我希望使用perl脚本添加或删除数据(该脚本用于部署或取消部署jboss webapps,然后可以用于更新logstash转发器配置) 我在添加和修改配置文件方面没有问题,但我找不到删除对象的正确方法 下面是config.json文件的一个示例: { "network" : { "timeout" : 15, "ssl ca" : "/etc/logstash-forwa

我正在处理一个JSON配置文件(logstash转发器),在该文件中,我希望使用perl脚本添加或删除数据(该脚本用于部署或取消部署jboss webapps,然后可以用于更新logstash转发器配置)

我在添加和修改配置文件方面没有问题,但我找不到删除对象的正确方法

下面是config.json文件的一个示例:

{    
    "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;